0

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

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

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

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

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

extern "C" {
     __declspec(dllexport) bool IsDataValid();
}

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

extern bool __cdecl IsDataValid() { 
//function stuf......... returns a bool
}

导入到 C# 项目中的表单 C# 应用程序中,如下所示:

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

它是从 C# 表单 .cs 文件中的同一位置调用的:

bool isDataValid = IsDataValid();

它返回带有消息的异常:

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

我在从 c++ 代码生成的 .dll 上使用了 dumpbin.exe 和依赖项walker,它表明它具有 IsDataValid() 入口点。

非常感谢所有帮助...

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

4

1 回答 1

8

您遇到了 C++ 名称修饰。将 C++ 函数声明为 extern "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 上运行它,您将看到这些函数在编译时实际命名的内容。

于 2011-01-15T00:06:09.703 回答