长期的读者,第一次的海报。我希望有一天能在这里回答问题...

所以有点类似于:"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/

10-09 08:10