vs2010中的Native / Mixed-mode dll链接错误

时间:2011-06-26 08:20:25

标签: visual-studio-2010 dll linker native mixed-mode

我试图理解本机代码如何与.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选项,一切正常,所以我假设我已经正确设置了项目之间的所有依赖关系。关于我做错了什么的任何建议?

1 个答案:

答案 0 :(得分:3)

您必须使用Project + Project Dependencies才能在没有/ clr的情况下使用它。是的,如果使用/ clr编译项目,则不起作用。将.lib用于托管代码非常不寻常。您必须明确告诉链接器链接托管项目的.lib。

右键单击EXE项目,“属性”,“链接器”,“输入”,“其他依赖项”设置。假设两个项目都在一个解决方案中,请输入:

..\$(ConfigurationName)\mumble.lib

其中 mumble 是您的托管项目的名称。重复发布配置。

请注意以这种方式使用托管代码不能很好地扩展。 C ++ / CLI编译器自动为导出的函数生成thunk,以确保在调用托管函数之前加载并初始化CLR。然而,这确实需要付出代价,我在笔记本电脑上每次通话时间为640纳秒,不计入初始化CLR的开销。使用COM是避免成本的有效方法。或者您可以自己托管CLR,查找CorBindToRuntimeEx()。