【问题标题】:Calling a native function from managed code从托管代码调用本机函数
【发布时间】:2015-01-20 08:34:47
【问题描述】:

我有一个托管的 C++/CLI 项目,它必须使用一些本机代码。本机头文件的简化版本是:

struct structA
{
   // Some variables...
};
struct structB
{
   // Some similar variables...
   void convertTo(structA& dest);
};

此标头包含在托管代码中。托管代码有:

structA sA;
structB sB;
// Load data into sB...
sB.convertTo(sA);

我正在使用 Visual Studio 2008 并使用 /clr 编译托管代码。这当然会产生链接器错误 (LNK2028),因为隐式调用约定不同。但是我一直无法使用extern "C" 声明来解决这个问题(或者我可能用错了)。我已经尝试了这里为类似问题提供的几种解决方案,但均无济于事。

如何从托管代码中正确调用非托管函数?这里需要什么声明或包装?

【问题讨论】:

  • 我是用/clr编译的,其实...
  • 好的,抱歉,这就是错误帮助页面的意思
  • .h 文件中的 C 样式声明必须用 #pragma managed 包装,以便编译器知道函数不是托管代码。或者函数声明必须明确指定调用约定,这总是最好的做法。使用 __stdcall 或 __cdecl 属性。

标签: c++ c++-cli


【解决方案1】:

事实证明,这不是托管-非托管冲突问题。我只是忘记将使用的函数声明为已导出,即

__declspec(dllexport) void convertTo(structA& dest);

未引用函数的第二个更一般的链接器错误 (LNK2019) 是我应该关注的。奇怪的是,还抛出了托管-非托管冲突错误 (LNK2028),因为这是一个更专业的错误(这也让我偏离了轨道)。据我所知,这个错误应该只适用于我使用/clr:pure,正如 cmets 中所建议的那样。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2020-06-21
    • 2013-08-24
    • 2011-10-02
    • 2011-06-13
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多