在c#项目中,如何引用用c++编写并使用/clr编译的项目?

In a C# project, how can I refer to a project written in C++ and compiled with /clr?

本文关键字:项目 clr 编译 c++ 何引用 引用      更新时间:2023-10-16

我有一个用非托管c++编写的相当大的项目,并生成一个DLL。我希望能够在。net项目中使用DLL(在这种情况下,只是一个基本的WinForm应用程序)。我用/clr集重建了DLL。它成功地建造了。在我的WinForm项目中,我选择了Add Reference,选择了project选项卡,然后选择了DLL项目。它被成功地作为参考添加到我的WinForm项目中。但是,我在使用DLL时遇到了麻烦。我想为它添加一个使用指令,但我不知道DLL有什么名字。我尝试使用与文件相同的名称,但它不起作用。我怎么知道它的名字是在using指令中使用的?

非常感谢!

RobR

/clr开关允许您将。net类型(ref class, interface class)与其他c++代码混合。它不会神奇地让本地c++代码在c#中可用。

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

要回答您的其他问题"我如何发现在任意。net程序集中定义了哪些名称空间?"使用程序集查看器/反编译器,如dotPeek, . net Reflector等

您需要用c++编写托管包装器类。查看这篇msdn文章

实际上你不需要将整个dll编译为/clr,只需要编译托管包装器。并不是所有的c++代码都可以在/clr下工作,并且会有一定的减速。