1. 程式人生 > >VS2013中,無法嵌入互操作型別“……”,請改用適用的介面 問題解決

VS2013中,無法嵌入互操作型別“……”,請改用適用的介面 問題解決

一、匯出到execl表 需要引用 Microsoft Office 14.0 Object Library   的程式集 但是在應用之後出現錯誤 無法嵌入互操作型別“Microsoft.Office.Interop.Excel”,請改用適用的介面的  百度了下 選中專案中引入的dll,滑鼠右鍵,選擇屬性,把“嵌入互操作型別”設定為False。 然後就解決了。。。

二、

何為 “嵌入互操作型別” ???

  1. ”嵌入互操作型別”中的嵌入就是引進、匯入的意思,類似於c#中using,c中include的作用,目的是告訴編譯器是否要把互操作型別引入。

  2. “互操作型別”實際是指一系列Com元件的程式集,是公共執行庫中庫檔案,類似於編譯好的類,介面等。

  3. “嵌入互操作型別”設定為true,實際上就是不引入互操作集(編譯時候放棄Com程式集),僅編譯使用者程式碼的程式集。而設定為false的話,實際就是需要從互操作程式集中獲取 COM 型別的型別資訊

互操作性——這條術語用來描述的是不同的程式(programs)藉助於同一套交換格式(exchange formats)來交換資料,讀寫相同檔案格式(file formats)以及採用相同協議(protocols)的能力。(互操作性的這種定義並‘沒有’期望那種在不同處理器平臺<processor platforms >之上執行相同二進位制程式碼<binary code>的能力。)互操作性的缺乏可能是在程式設計期間對於

標準化(standardization)缺乏重視的一種後果。實際上,在計算機世界(computing world)的那些並未基於標準的部分當中,互操作性也的確並非理所當然的事情。

  根據國際標準ISO/IEC 2382-01 資訊科技詞表,基礎術語(ISO/IEC 2382-01, Information Technology Vocabulary, Fundamental Terms),互操作性定義如下:“在幾乎或幾乎無須使用者瞭解各種功能單元的獨特特性的情況下,這些功能單元之間進行通訊、執行程式或者傳輸資料的能力”。以上兩段是維基百科對“互操作性”的解釋,讓我們對“嵌入互操作型別”有了個基本的概念。

  那就接著講什麼叫“嵌入互操作型別”,下面是摘自msdn雜誌上的一段。

嵌入 COM 互操作型別

這更像是 C# 編譯器功能,而不像是 C# 語言功能,但您現在可以使用 COM 互操作程式集,而不要求該程式集在執行時必須存在。目的是減輕將 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 開關,來嵌入您必須引用的互操作程式集中的互操作型別。

  本文中介紹的所有功能本身都可以產生大量討論,每一個主題都值得撰文論述。我省略了許多詳細資訊,也有許多詳細資訊只是一帶而過。看到這裡,我們大概有了清楚的認識,那就讓我先做幾點總結吧(不足之處歡迎補充)。

1.”嵌入互操作型別”中的嵌入就是引進、匯入的意思,類似於c#中using,c中include的作用,目的是告訴編譯器是否要把互操作型別引入。

2.“互操作型別”實際是指一系列Com元件的程式集,是公共執行庫中庫檔案,類似於編譯好的類,介面等。

3.“嵌入互操作型別”設定為true,實際上就是不引入互操作集(編譯時候放棄Com程式集),僅編譯使用者程式碼的程式集。

而設定為false的話,實際就是需要從互操作程式集中獲取 COM 型別的型別資訊。

不知道大家明白了沒有。