使用P / Invoke从C#调用C函数

时间:2012-12-03 15:13:12

标签: c# .net visual-c++ pinvoke

我有一个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绝对存在。还有什么可能是错的?

1 个答案:

答案 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();