尽管功能设置正确,DllImport __Internal 仍无法正常工作
DllImport __Internal not working despite correct function setup
使用嵌入式 Mono,我试图从 C# 中执行一个非常简单的 C 函数。
这是 C++ 代码中的函数(在全局范围内):
extern "C"
{
static int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
这是 C# 代码:
[DllImport("__Internal", EntryPoint="dllImportTest")]
public static extern int dllImportTest();
public void testCFunctions()
{
int dllImport = dllImportTest();
System.Console.Write("Got dllImport: " + dllImport + "\n");
}
这是我得到的错误:
System.EntryPointNotFoundException: dllImportTest
at (wrapper managed-to-native) MonoGlue.ATestClass:dllImportTest ()
at MonoGlue.ATestClass.testCFunctions () [0x0000a] in <9effaf2265b34fbcb9a10abd58c42ed7>:0
我一直在查看示例和类似问题,但我没有看到哪里出了问题。为了确保 C 函数不会被优化掉,我在 C++ 代码中执行它。
如您所见,我什至阻止了内联。
然而,还是没有运气。一定还有我遗漏的东西。
原来 dllImportTest 函数没有出现在可执行文件中,因为它是静态的。诚然,全局命名空间中的静态函数无论如何在大多数情况下都没有什么意义。
所以替换这个:
extern "C"
{
static int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
有了这个:
extern "C"
{
int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
问题解决。
原因是,通过将全局命名空间中的函数设为静态,外部编译单元将无法访问它,这使得 C# 也无法访问它(我错误地认为这不会影响 C# 访问)。
事情在这里变得有点复杂,所以如果你想了解自己,请继续阅读编译单元。
如果您确实需要访问静态函数(无论在哪个命名空间中),我建议使用 "Internal Call" 方法 - 如 official mono example 中所示。它还有许多其他好处。
使用嵌入式 Mono,我试图从 C# 中执行一个非常简单的 C 函数。
这是 C++ 代码中的函数(在全局范围内):
extern "C"
{
static int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
这是 C# 代码:
[DllImport("__Internal", EntryPoint="dllImportTest")]
public static extern int dllImportTest();
public void testCFunctions()
{
int dllImport = dllImportTest();
System.Console.Write("Got dllImport: " + dllImport + "\n");
}
这是我得到的错误:
System.EntryPointNotFoundException: dllImportTest
at (wrapper managed-to-native) MonoGlue.ATestClass:dllImportTest ()
at MonoGlue.ATestClass.testCFunctions () [0x0000a] in <9effaf2265b34fbcb9a10abd58c42ed7>:0
我一直在查看示例和类似问题,但我没有看到哪里出了问题。为了确保 C 函数不会被优化掉,我在 C++ 代码中执行它。
如您所见,我什至阻止了内联。
然而,还是没有运气。一定还有我遗漏的东西。
原来 dllImportTest 函数没有出现在可执行文件中,因为它是静态的。诚然,全局命名空间中的静态函数无论如何在大多数情况下都没有什么意义。
所以替换这个:
extern "C"
{
static int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
有了这个:
extern "C"
{
int __attribute__((noinline)) dllImportTest()
{
return 66;
}
}
问题解决。
原因是,通过将全局命名空间中的函数设为静态,外部编译单元将无法访问它,这使得 C# 也无法访问它(我错误地认为这不会影响 C# 访问)。
事情在这里变得有点复杂,所以如果你想了解自己,请继续阅读编译单元。
如果您确实需要访问静态函数(无论在哪个命名空间中),我建议使用 "Internal Call" 方法 - 如 official mono example 中所示。它还有许多其他好处。