如何在C#中使用C++编写的外部.dll资源上正确创建入口点

Bo *_* Li 0 c# c++ dll entry-point

长时间读者,第一次海报.有一天,我希望在这里回答问题......

所以它类似于:"无法在dll中找到名为[function]的入口点"(c ++到c#类型转换)

但我似乎无法应用相同的解决方案......

基本上,我写了一个新的方法:

在C++项目的头文件中定义为:

extern "C" {
     __declspec(dllexport) bool IsDataValid();
}
Run Code Online (Sandbox Code Playgroud)

在C++项目的源文件中定义为:(仅限signiature)

extern bool __cdecl IsDataValid() { 
//function stuf......... returns a bool
}
Run Code Online (Sandbox Code Playgroud)

导入C#项目中的表单C#应用程序:

[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();
Run Code Online (Sandbox Code Playgroud)

它是从C#表单.cs文件中的同一个地方调用的:

bool isDataValid = IsDataValid();
Run Code Online (Sandbox Code Playgroud)

它返回一个带有消息的异常:

"无法找到DLL'CarChipSDK_C_Sharp.dll'中命名的入口点'IsDataValid()'.

我在从c ++代码生成的.dll上使用了dumpbin.exe和dependency walker,它显示它具有IsDataValid()入口点.

非常感谢所有帮助......

问题解决了!愚蠢的我,这是我现在公司以前的合作社的代码,结果他正在从bin/release文件夹中读取.dll,我正在构建bin/debug文件夹.应该知道的.真诚的道歉.

Ed *_* S. 8

您遇到了C++名称重整.将C++函数声明为extern"C".所以,在你的C++模块中......

extern "C" __declspec(dllexport) bool IsDataValid();
Run Code Online (Sandbox Code Playgroud)

您真的不需要入口点规范属性.您的C#声明将是:

[DllImport("CarChipSDK_C_Sharp.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();
Run Code Online (Sandbox Code Playgroud)

为了将来参考,dumpbin.exe是一个非常有用的程序,用于分析这样的问题.如果在DLL上运行它,您将看到这些函数在编译时实际命名的内容.