我有一个C函数,它是VS 2010项目的一部分,并且有这个签名:
real_T wrapper(void)
其中
typedef double real_T;
在我的C#代码中,我尝试了这个:
[DllImport(@"C:\Users\bla\Documents\Visual Studio 2010\Projects\bla\bla\Debug\bladibla.dll")]
public static extern double wrapper();
static void Main(string[] args)
{
wrapper();
}
但得到:
无法在DLL'C:\ Users \ bla \ Documents \ Visual Studio 2010 \ Projects \ bla \ bla \ Debug \ bladibla.dll'中找到名为'wrapper'的入口点。
dll绝对存在。还有什么可能是错的?
答案 0 :(得分:3)
可能正在使用错位名称导出该函数。你可以像这样压制破坏:
extern "C" {
real_T wrapper(void);
}
您显然也没有导出该功能。这样做的简单方法是:
extern "C" {
__declspec(dllexport) real_T wrapper(void);
}
如果仍然无法解决丢失的导出,请使用Dependency Walker之类的工具检查该函数是否实际上正在导出,如果是,则以什么名称导出。
最后,您应该将C#端的调用约定声明为cdecl,以匹配您的本机函数的调用约定。
[DllImport(@"...", CallingConvention=CallingConvention.Cdecl)]
public static extern double wrapper();