3

我试图了解本机代码如何与 .NET 代码交互,并且基本上试图实现本主题答案中的示例。示例代码有两个部分,一个进入使用 /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:函数 _wmain 中引用的未解析外部符号“bool __cdecl toUpper(void)”(?toUpper@@YA_NXZ)

一旦我关闭 dll 项目上的 /clr 选项,一切正常,所以我假设我已经正确设置了项目之间的所有依赖项。关于我做错了什么有什么建议吗?

4

1 回答 1

3

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

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

..\$(ConfigurationName)\mumble.lib

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

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

于 2011-06-26T14:31:06.837 回答