【发布时间】:2013-04-11 14:17:37
【问题描述】:
我有一个打开 /clr 选项的 DLL。我的 DLL 中有以下声明:
int __declspec(dllexport) __cdecl test();
另外,我有一个带有 /clr 选项的控制台。并在我的 main.cpp 文件中有以下声明:
int __declspec(dllimport) __cdecl test();
我在控制台应用程序的属性设置中添加了对 DLL 项目的引用。但是我仍然从编译器那里得到关于测试功能的未解决的外部问题。
我设法通过手动添加对编译器生成的 lib 文件的引用来进行编译。但后来我无法在 DLL 函数内打断点(它说源代码与原始版本不同或符号尚未加载...)
有人可以帮我吗?
【问题讨论】:
-
您是否真的在任何地方定义了
test()(而不是仅仅声明它)?你真的可以链接到旧版本的库吗? -
是的,我确实在 cpp 文件中定义了测试。我怀疑我是否链接到旧版本的 lib,因为即使我清理了整个解决方案,问题仍然存在。
-
对不起,我看错了你的问题。 DLL 是否真正被管理(即您可以简单地删除 /clr 选项)吗?
-
我在遇到同样的问题时发现了这个问题。我的情况可能和你一样,也可能不一样。无论如何,我需要的解决方案可能会帮助你。这是我的场景:我在一个大型遗留系统(10 多个 EXE,50 多个 DLL)上工作——所有这些系统都是用 C++ 编写的,直到大约 2005 年,当我们开始将一些部分迁移到 C# 时,使用 C++/CLR 作为互操作。现在,如果我可以简单地检查我所有的 C++ 代码并将编译器选项设置为 /CLR、修复错误并发布 C# 和 C++/CLR 的混合 - 没有留下任何“纯”非托管代码,那就太好了。
-
如果可行,我可以迁移 C++/CLR 实现以利用 .NET 框架。我可以将托管 (CLR) 接口添加到 DLL。最终,我什至可以用 C# 替换 C++/CLR 代码(更容易处理)。但它不起作用。