1

我有一个 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肯定在那里。还有什么可能是错的?

4

1 回答 1

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();
于 2012-12-03T15:18:37.777 回答