.Net - 用.C或C ++编写的应用程序可以使用.Net编写的类库(dll)吗?

时间:2009-08-28 14:10:23

标签: .net c++ interop

假设我已经在.Net中编写了一个类库(dll),现在我让开发人员在他们的.Net应用程序中使用它。

但是,库本身对于本地编写的开发人员(在C或C ++中)也可能有用。所以我的问题是我的托管DLL是否可以在C或C ++中使用?

如果没有,为什么?也许我必须添加一些特定的代码才能让本机编码器使用它?

感谢。

编辑:如果其他人对此问题感兴趣,我在Google图书中找到了this文章,其中介绍了如何使用COM中的Net.classes。

3 个答案:

答案 0 :(得分:10)

在基于CLR的语言之外公开.NET程序集的唯一方法是通过COM Interop。您无法直接以非托管语言引用.NET .dll。

原因是所使用的“.dll”文件扩展名纯粹是出于外观和一致性的错觉。 .NET生成的.dll文件不包含任何机器代码,它们包含在运行时编译的IL(中间语言)(称为即时编译或JIT)。代码在放入.dll文件时不会编译。因此,没有任何非托管语言可以执行。

COM interop允许CLR加载.dll,执行JIT编译,并使用COM系统处理本机代码和.NET .dll之间的通信。

答案 1 :(得分:1)

我不同意亚当罗宾逊的观点。他的描述,特别是解释COM暴露属性的评论肯定是实现它的一种方式。 Thoe其他人正在让C或C ++应用程序host the Microsoft CLR运行您的.Net DLL。您也许能够托管Mono,它应该同样能够运行纯.Net DLL。 (即没有P / Invoke技巧)

答案 2 :(得分:0)

如果你能满足于那个完全成熟的C ++类,并且不喜欢COM包装器, 然后使用this solutionthis one允许您将静态方法公开为函数导出或将简单的C#结构公开为C ++结构。 Visual Studio是必需的,但Microsoft不支持它,因此您使用它需要您自担风险。 我可以证明它对我有用。另一种方法是使用de Icaza在他的博客中描述的mono和CXXI