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

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上运行它,您将看到这些函数在编译时实际被命名的名称。