How to properly create an entry point on an external .dll resource written in C++ consumed in C#
长期的读者,第一次的海报。我希望有一天能在这里回答问题...
因此,它类似于:"无法在dll中找到名为[function]的入口点"(从C ++到C#类型的转换)
但是我似乎无法应用相同的解决方案...
基本上,我写了一个新方法:
在C ++项目的头文件中定义为:
1 2 3 | extern"C" { __declspec(dllexport) bool IsDataValid(); } |
在C ++项目的源文件中定义为:(仅签名)
1 2 3 | extern bool __cdecl IsDataValid() { //function stuf......... returns a bool } |
导入到C#项目内的Forms C#应用程序中的方式如下:
1 2 3 | [DllImport("CarChipSDK_C_Sharp.dll", EntryPoint ="IsDataValid")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsDataValid(); |
在C#表单.cs文件中的同一位置调用它,如下所示:
1 | bool isDataValid = IsDataValid(); |
它返回一条异常消息:
"Unable to find an entry point
'IsDataValid()' named in DLL
'CarChipSDK_C_Sharp.dll'.
我已经在c ++代码生成的.dll上使用了dumpbin.exe和依赖项walker,它表明它具有IsDataValid()入口点。
非常感谢所有帮助...
问题解决了!愚蠢的我,这是我前任公司的代码,原来他是从bin / release文件夹中读取.dll的,当时是我正在构建的bin / debug文件夹。应该知道。诚挚的歉意。
您正在遇到C ++名称修改。 将C ++函数声明为外部" C"。 因此,在您的C ++模块中...
1 | extern"C" __declspec(dllexport) bool IsDataValid(); |
您确实也不需要入口点规范属性。 您的C#声明将为:
1 2 3 | [DllImport("CarChipSDK_C_Sharp.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsDataValid(); |
供将来参考,dumpbin.exe是用于分析此类问题的非常有用的程序。 如果在DLL上运行它,您将看到这些函数在编译时实际被命名的名称。