2012-06-05 97 views
3

在.NET Framework,我可以用一种语言写一个图书馆的印象(比如C++),然后导入代码和其他一些C#项目干净利落地使用该库(假设他们都目标相同的框架版本)。语言interop如何在.Net中工作?

但是,我不明白这是如何工作的,因为在C++中定义的方法在C#或VB.net等其他语言中是没有意义的,例如一个方法参数需要一个结构为isn指针。

也许我的例子是站不住脚的,由于我有限的所有CLR语言的知识,但是我必须假设有东西,一种语言能做到这一点的另一个不能 - 我不明白如何这些差异被处理。

回答

3

完全有可能创建一个方法,类,结构,类型或任何一种.NET语言,不能由另一个直接调用。间接调用它(例如通过反射)始终是可能的。

也就是说,如果你看任何编译的C#项目,你会看到,编译后的代码包含了一些代码怪异的名字和人物在里面,通常支持泛型。一个这样的名字是<Module>(包括括号),即使它是公开的方法,也不能直接从C#调用。

是决定编译为CLR语言设计者必须支持一个小子集公共类型。这被称为CLS Compliance大约是a common naming convention,没有公共指针或公共不安全的成员或类,没有名称只是大小写不同,没有公共静态字段和some more rules。当他们服从这个规则时,可以保证任何其他.NET语言都可以调用你的方法。他们知道如何做到这一点,因为这些规则已经很好地制定和记录。

你甚至可以创建non-compliant C# code。它会(通常)编译,但不保证所有兼容的语言都可以调用您的方法。大多数其他语言也是如此,包括C++。NET。这是一个Microsoft Design Guideline to mark your assemblies as CLSCompliant by default(不管它是用C++编写的,VB,Ruby都无所谓)。

2

.NET框架支持不同种类的语言interop。首先是Abel谈论的那种,.NET编译器必须生成在CLI规范中描述格式的程序集。标准化为Ecma-335,对元数据(类型描述)和代码(IL或中间语言)进行严格描述。这使得interop很容易实现,一种语言编译器可以读取另一种语言的类型,而.NET运行库使它们一起工作。

但你在谈论C++,这不是一个管理的语言。这需要与本机代码进行互操作。这在技术上不是很困难,毕竟抖动也会生成本机代码。你只需要一种方式描述本机代码,所以有一个合理的成功机会。有三种不同的方式:

  • 你可以声明功能本地代码编写与函数[DllImport]属性。这适用于暴露C风格调用接口的语言运行时。 Windows API就是这样。这不是而是包括C++,至少在您利用其对类的支持时不会。

  • CLR对COM有很好的支持,COM是.NET的盛大父亲,也是微软实施的早期语言互操作标准。特别是COM自动化子集运行良好,您可以简单地添加对COM组件类型库的引用,并且.NET工具会自动生成粘合剂以将组件实现的COM对象模型作为受管类型公开。 Office Interop可以像这样工作,以及在“添加引用”对话框的“COM”选项卡中找到的所有内容。那可能工作在用C++编写的代码,虽然COM当然不需要用C++编写COM组件。 VB6和Delphi是支持COM的着名语言。反之,您可以轻松地将.NET代码作为COM公开给其他运行时。 WinRT API,可以让你编写在Windows 8上运行的Metro应用程序的基于COM的核心,尽管它隐藏在语言预测中。

  • 最终的互操作工具和您需要用来制作C++代码的工具是C++/CLI语言。它是Microsoft C++编译器内置的扩展,它允许将本地C++代码编译为IL并存储在程序集中。可以选择以C++风格语法声明托管类,这些类可以直接由托管代码使用,并可以创建本机C++类对象并调用其方法。 .NET框架的几个部分是以这种方式构建的,特别是mscorlib,System.Data和PresentationManager,它们都依赖于本机代码来完成工作。将C++/CLI视为最终的粘合剂语言。

+0

一如既往的明确答案;)。然而,我认为OP意味着他想使用Managed C++,就像你的第三种选择一样,因为他写道“假设它们都是针对相同的框架版本”。因此我专注于CLI。 – Abel