2012-06-05 29 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