【问题标题】:How to properly create an entry point on an external .dll resource written in C++ consumed in C#如何在 C# 中使用的用 C++ 编写的外部 .dll 资源上正确创建入口点
【发布时间】:2011-06-09 11:47:47
【问题描述】:

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

所以它有点类似于:"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# 项目中的表单 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++ dll entry-point


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的回答,我刚下班,所以我会在星期一试试这个。看起来很有希望!非常感谢。
    • Dependency Walker 以漂亮的表格格式显示与 dumpbin 相同的信息,适合那些喜欢 GUI 的人。
    • @mcbobo:没问题。我在系统中工作时经常使用互操作,并且经常需要围绕驱动程序接口等构建 GUI。
    • 奇怪...我显然已经将它声明为' extern "C" ' 我放了 extern "C" { //lots of function headers... 和 __declspec(dllexport) bool IsDataValid() ; } 。我继续检查使用 dumpbin 和dependancy walker 创建的.dll,它们都表明我有 IsDataValid 作为入口点......你们知道还有什么问题吗?
    • 我已经修好了。对不起大惊小怪。这是一个调试/发布版本问题。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多