0

我有使用 /clr 编译的 C++ 托管 dll,它具有一些全局函数。

例如

void Managed2UnManaged(DataStructures::AAA^ elem, DataStructures::CPP::AAA* copy_elem);    

当我尝试在 C++ 托管控制台应用程序中使用这些函数时,出现以下错误

错误 LNK2028:未解析的令牌 (0A00048C) “void __clrcall Managed2UnManaged(class DataStructures::AAA ^,class DataStructures::CPP::AAA *)”(?Managed2UnManaged@@$$FYMXP$AAVAAA@DataStructures@NextIn@@PAV1CPP@23 @@Z)

错误 LNK2019:无法解析的外部符号“void __clrcall Managed2UnManaged(class DataStructures::AAA ^,class DataStructures::CPP::AAA *)”(?Managed2UnManaged@@$$FYMXP$AAVAAA@DataStructures@NextIn@@PAV1CPP@23@@ Z)

我向控制台应用程序添加了对 dll 的引用,但它仍然给出了错误。

我也尝试添加 __declspec(dllexport) 但后来我得到了

错误 C3395:“Managed2UnManaged”:__declspec(dllexport) 不能应用于具有 __clrcall 调用约定的函数

如果我指定 __stdcall 我得到

错误 C4439:“Managed2UnManaged”:签名中具有托管类型的函数定义必须具有 __clrcall 调用约定

我正在使用VS2012。

h文件有

class XXX {
 public:
static void Managed2UnManaged(DataStructures::RegResult^ elem,     DataStructures::CPP::RegResult* copy_elem);
};

和cpp文件

 void XXX::Managed2UnManaged(DataStructures::RegResult^ elem, DataStructures::CPP::RegResult* copy_elem)
{

}

问题解决了。问题是我还需要声明类公共参考。这导致了另一个问题,因为本机 c++ 类型是私有的。所以我不得不使用 make_public 杂注。谢谢大家。

4

1 回答 1

2

我认为问题可能是 CLR 不允许全局函数。

您必须创建一个托管类并将您的函数编写为该类的静态成员函数,才能导出该函数。

于 2012-12-18T08:45:16.107 回答