我试图理解本机代码如何与.NET代码交互,我基本上试图在这个topic的答案中实现该示例。示例代码有两个部分,一个是使用/ clr选项编译的.dll:
__declspec(dllexport) bool toUpper(void)
{
return true;
}
并且应该调用此函数的代码进入win32应用程序,该应用程序本机编译:
bool toUpper(void);
int _tmain(int argc, _TCHAR* argv[])
{
bool b = toUpper();
return 0;
}
然而,vs2010给出了以下链接器错误:
错误LNK2019:未解析的外部 符号“bool __cdecl toUpper(void)” (?toUpper @@ YA_NXZ)引用于 function _wmain
一旦我关闭了dll项目上的/ clr选项,一切正常,所以我假设我已经正确设置了项目之间的所有依赖关系。关于我做错了什么的任何建议?
答案 0 :(得分:3)
您必须使用Project + Project Dependencies才能在没有/ clr的情况下使用它。是的,如果使用/ clr编译项目,则不起作用。将.lib用于托管代码非常不寻常。您必须明确告诉链接器链接托管项目的.lib。
右键单击EXE项目,“属性”,“链接器”,“输入”,“其他依赖项”设置。假设两个项目都在一个解决方案中,请输入:
..\$(ConfigurationName)\mumble.lib
其中 mumble 是您的托管项目的名称。重复发布配置。
请注意以这种方式使用托管代码不能很好地扩展。 C ++ / CLI编译器自动为导出的函数生成thunk,以确保在调用托管函数之前加载并初始化CLR。然而,这确实需要付出代价,我在笔记本电脑上每次通话时间为640纳秒,不计入初始化CLR的开销。使用COM是避免成本的有效方法。或者您可以自己托管CLR,查找CorBindToRuntimeEx()。