1. 程式人生 > >無法嵌入來自**的互操作型別解決方案

無法嵌入來自**的互操作型別解決方案

遇見這個問題,網上查了下解決方案挺簡單的,右擊屬性,嵌入互操作型別改為false就行了。


問題解決了,不明白“互操作型別”是什麼概念,順道瞭解下:

互操作性——不同的程式藉助同一套交換格式交換資料,讀寫相同格式檔案等。無須使用者瞭解各種功能單元的獨特特性的情況下,使得功能單元之間進行通訊、執行過程或者傳輸資料的能力。

“嵌入互操作型別”:就是匯入的意思,告訴編譯器是否要把互操作型別引入,若為TRUE,即告訴編譯器您將互操作型別嵌入到visual Studio中。

“互操作型別”:指一系列的com元件的程式集,是公共執行的類庫檔案。

瞭解:當 COM 互操作在最初版本的 .NET Framework 中引入時,就確立了主互操作程式集 (PIA) 的概念。引入此概念,是為了解決在元件之間共享 COM 物件的難題。for instance:如果您有一些不同的互操作程式集,分別定義了一個 Excel Worksheet,則我們無法在元件之間共享這些 Worksheet,因為它們具有不同的 .NET 型別。PIA 通過只存在一次而解決了這個難題:所有客戶端都使用它,因此 .NET 型別始終是匹配的。

  儘管 PIA 在理論上是個好主意,但在實際部署中卻被證明是個大麻煩,因為它只有一份,而有多個應用程式可能會嘗試安裝或解除安裝它。而由於 PIA 通常很大,事情更復雜了。Office 在預設 Office 安裝方式中並未部署它們,使用者只需通過使用 TLBIMP 來建立自己的互操作程式集,即可輕鬆繞過這一個程式集系統。

  因此,現在為了扭轉這種局面,發生了兩件事:

對於兩個結構相同且共享相同識別特徵(名稱、GUID 等)的 COM 互操作型別,執行時能夠聰明地將其看作同一個 .NET 型別。C# 編譯器利用這一點的方式是在編譯時直接在您自己的程式集中重現互操作型別,因此不再要求在執行時存在該互操作程式集。

由於篇幅所限,我不得不省略一些詳細資訊,但即使不瞭解這些資訊,您也應該能夠毫無障礙的使用這個功能,就像動態功能一樣。您通過將引用上的“嵌入式互操作型別”屬性設定為 true,告訴編譯器為您將互操作型別嵌入到 Visual Studio 中。

由於 C# 團隊希望這種方法成為引用 COM 程式集的首選方法,因此在預設情況下,Visual Studio 會將新增到 C# 專案中的任何新互操作引用的此屬性設定為 True。如果您使用命令列編譯器 (csc.exe) 來編譯您的程式碼,請使用 /L 開關,而不是 /R 開關,來嵌入您必須引用的互操作程式集中的互操作型別。

參考文章:http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html