0

我的 C++ dll 中有以下方法,我试图通过 p/invoke 在我的 C# 应用程序中调用它。

void Graphics::Create(char* Project, char* Connection, int Count, char *_Source[], char *_Destination[], char *_Search[], char *_Replace[], int _Block[])

我在 C# 中使用的签名是:

[DllImport("Wincc.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static public extern void Create(IntPtr Project, IntPtr Connection, int Count, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Source, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Destination, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Search, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Replace, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4)] int[] _Block);

我在 C# 中得到未知的方法。看来我的签名是错误的。但是我无法弄清楚出了什么问题。

4

2 回答 2

1

您不能调用 C++函数,因为 C++ 没有 C 链接。extern "C"在你的函数之前实现这个添加。

extern "C" {
    int foo();
}

但它不适用于 C++方法。不过有一个更丑陋的解决方案。但我不推荐它。

最好的方法是写下一个包装器。仅使用函数将您的任务(仅您需要的)包装在 C++ 中。在函数中,您可以调用这些方法。然后用 C 链接编译它。然后你就可以从 C# 调用它了。

于 2013-01-05T03:23:18.537 回答
0

检查你的 DLL 依赖 walker,看看你的 DLL 中是否有正确的导出。尝试在 YOURDLLNAME.DEF 文件中定义您的导出。像这样:

你的名字.DEF

出口创建

于 2013-01-05T03:23:06.570 回答