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