【问题标题】:DUMPBIN utility mangled name outputDUMPBIN 实用程序损坏的名称输出
【发布时间】:2013-12-24 10:34:33
【问题描述】:

我正在使用 DUMPBIN 实用程序从 c++ dll 中获取损坏的名称以在 c# 应用程序中使用。 我正在使用 __declspec(dllexport) 公开一个 c++ 类成员函数,输出损坏的名称结果如下

?InitPort@CProtocolStack@@QAEEHEPAEKE@Z = ?InitPort@CProtocolStack@@QAEEHEPAEKE@Z (public: unsigned char __thiscall CProtocolStack::InitPort(int,unsigned char,unsigned char *,unsigned long,unsigned char))

在导入相同的函数时,我是否需要在 C# 应用程序中使用全名? 如果不是,那哪一部分足够导入?

【问题讨论】:

  • 是一个C++类的实例方法。你不能调用它们,需要一个 C++/CLI 包装器。

标签: c++ dll dllimport dllexport


【解决方案1】:

你只需要这个:

?InitPort@CProtocolStack@@QAEEHEPAEKE@Z

然后你声明它是这样的:

[DllImport("your.dll",
    EntryPoint = "?InitPort@CProtocolStack@@QAEEHEPAEKE@Z",
    ExactSpelling = true)]
static extern byte CProtocolStack::InitPort( /* etc. */);

【讨论】:

  • @JamesKanze 非常正确,但与此同时,我们尽我们所能...... COM 可能是更好的互操作选项。
  • 声明函数extern "C",这样名字就不会乱了。
  • @JamesKanze 我认为extern "C" 不适用于类成员函数。
  • 它没有。您必须提供接口包装函数。但是C#类成员函数可以用C++中的extern "C"函数来实现。
【解决方案2】:

不要。如果您不使用托管 C++(可以调用 直接来自 C#),在您的界面中声明函数 extern "C",然后直接使用函数名。绞肉罐 从一个版本的编译器更改为下一个版本; extern "C" 名称不会。

【讨论】:

    【解决方案3】:

    如果你的函数不需要重载,可以使用extern "C"来确定函数名。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多