在C ++ / CLI代码中包含来自非托管C ++代码的头文件

我正在为非托管C ++库编写CLR包装器。

我从非托管库中包含两个文件:

//MyCLIWrapper.h
#include "C:PATHTOUNMANAGEDHeader.h"
#include "C:PATHTOUNMANAGEDBody.cpp"

然后,我正在为非托管库函数编写CLI实现:

//MyCLIWrapper.h
// includes ...
void MyCLIWrapper::ManagedFunction()
{
  UnmanagedFunction(); // this function is called successfuly
}

但是,如果我的Unmanaged函数包含对其他非托管头文件中定义的其他函数的调用。 这会导致编译器链接错误。

如果我将include添加到定义这些函数的非托管头文件中,我的错误将得到解决。 但是,有很多功能,并且需要大量的功能。

有没有不同的方法来解决这个问题?

编辑: PS我的托管代码是在一个单独的Visual Studio项目(输出 - DLL),编译设置设置为/ CLR。 非托管代码位于单独的Win32项目(输出 - DLL)中。

另外,经过更多的研究后,我得出结论,理论上我可以将我的Win32非托管项目设置为CLR,并在其中添加我的托管类和头文件作为入口点,然后将它们全部编译为单个DLL文件。 这可能会解决(?)联动错误。 但是,我宁愿保留松耦合以及将我的非托管项目设置为CLR可能引发的其他一系列问题。

编辑#2:我引用的非托管类(body.cpp,header.h)包含所需文件,该文件定义导致问题的函数。 但是,我的托管代码没有选择位于非托管body.cpp和header.h中的包含。


链接器错误与编译器错误是不同的。 您忘记记录您看到的确切链接程序错误,但是当您使用/ clr生效时编译代码时非常常见的问题是非C ++成员函数的默认调用约定发生更改。 默认值是__clrcall,这是一个为托管代码优化的约定。 不带/ clr编译的函数默认为__cdecl。 这改变了函数名称被破坏的方式。 您在链接器错误消息中看到了这一点,表明它正在查找__clrcall函数并且找不到它。

您需要使用__cdecl明确声明.h文件中的函数。 或者告诉编译器这些函数不是托管代码。 解决这个问题的最佳方法是:

#pragma managed(push, off)
#include "unmanagedHeader.h"
#pragma managed(pop)

解决方案非常简单:

  • 我在Visual Studio中将非托管和托管项目添加到单个解决方案中。
  • 将非托管项目的“配置类型”设置为“静态库”(.lib)。
  • 右键单击托管项目 - >引用 - >添加引用 - >项目 - > - >添加引用。
  • 然后在我的托管类中,我包含header.h(仅),就像我在我的问题中一样。
  • 编译成功!
  • 谢谢

    链接地址: http://www.djcxy.com/p/59613.html

    上一篇: Including headers from an unmanaged C++ code inside C++/CLI code

    下一篇: Problem creating managed classes and namespaces in C++/CLI