我有用/clr编译的C++托管dll,该dll具有一些全局函数。
例如
void Managed2UnManaged(DataStructures::AAA^ elem, DataStructures::CPP::AAA* copy_elem);
当我尝试在C++管理的控制台应用程序中使用这些函数时,我会收到以下错误
错误LNK2028:未解析的令牌(0A00048C)"void __clrcall-Managed2UnManaged(类数据结构::AAA^,类数据结构::CPP::AAA*)"(?Managed2UnManaged@@$$FYMXP$AAVAAA@DataStructures@NextIn@@PAV1CPP@23@@Z)
错误LNK2019:未解析的外部符号"void __clrcall-Managed2UnManaged(类数据结构::AAA^,类数据结构::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)
{
}
问题已解决。问题是,我还需要声明类public ref。这导致了一个不同的问题,因为本机c++类型是私有的。所以我不得不使用make_public pragma。谢谢大家。
我认为问题可能是CLR不允许全局函数。
必须创建一个托管类,并将函数编写为该类的静态成员函数,才能导出该函数。