2

我有一个用非托管 C++ 编写并生成 DLL 的相当大的项目。我希望能够在 .Net 项目中使用 DLL(在这种情况下,只是一个简单的 WinForm 应用程序)。我用 /clr 集重建了 DLL。它构建成功。在我的 WinForm 项目中,我选择了添加引用,选择了项目选项卡,然后选择了 DLL 项目。它已成功添加为我的 WinForm 项目中的参考。但是,我在使用 DLL 时遇到了问题。我想为它添加一个 using 指令,但我不知道 DLL 的名称。我尝试使用与文件相同的名称,但它不起作用。如何找出在 using 指令中使用的名称?

非常感谢!

罗伯

4

2 回答 2

1

/clr开关使您能够将 .NET 类型 ( ref class, interface class) 与其他 C++ 代码混合使用。它不会神奇地使本机 C++ 代码在 C# 中可用。

除其他原因外,C++ 代码严重依赖保持不变的对象地址,但在 .NET 中则不然。.NET 要求所有对象都有一个 v-table,以便垃圾收集器可以找出对象是什么数据类型(以及因此在对象指针中包含的位置),但大多数本机类型根本没有 v-table。如果不更改布局并破坏与本机代码的兼容性,编译器就无法使本机类型与 .NET 兼容。这会破坏目的。因此,虽然编译器可以为原生类型生成元数据,但它对 C# 没有用处。相反,它允许您将 .NET 兼容的类和本机类型一起包含在同一个 DLL 中,并在它们之间无缝地进行内部调用。

要回答您的另一个问题“我怎样才能找出在任意 .NET 程序集中定义了哪些命名空间?” 使用程序集查看器/反编译器,例如 dotPeek、.NET Reflector 等。

于 2013-06-20T20:33:46.353 回答
0

您需要用 C++ 编写托管包装类。检查这篇 msdn 文章

实际上,您不需要将整个 dll 编译为 /clr,只需将托管包装器编译为。并非所有 c++ 代码都可以与 /clr 一起使用,并且会出现适度的减速。

于 2013-06-20T20:38:26.573 回答