創建了對嵌入的互操作程序集間接引用,無法嵌入互操作類型


由於程序集“\Debug\AcNetUtils.dll”
創建了對嵌入互操作程序集“\Debug\Interop.AcReport.dll”
的間接引用,因此創建了對該程序集的引用。請考慮更改其中一個程序集的“嵌入互操作類型”屬性。
創建了對嵌入的互操作程序集“<assembly1>”的引用,因爲程序集“<assembly2>”間接引用了該程序集。 請考慮更改任一程序集的“嵌入互操作類型”屬性。
原因: 引用(assembly1) 的 嵌入互操作類型( Embed Interop Types) 屬性設置爲 True
引用(assembly2) 的 嵌入互操作類型( Embed Interop Types) 屬性設置爲 false
而assembly2也引用了assembly1,這將導致編譯器無法嵌入assembly1該程序集中的互操作類型信息
解決辦法 assembly1,assembly2的嵌入式互操作類型全部設置爲false,或者true
參見 http://msdn.microsoft.com/zh-cn/library/ff182188.aspx
http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html


3.“嵌入互操作類型”設定爲true,實際上就是不引入互操作集(編譯時候放棄Com程序集),僅編譯用戶代碼的程序集。

而設定爲false的話,實際就是需要從互操作程序集中獲取 COM 類型的類型信息。



針對word或excel操作時,出現VS2010中,無法嵌入互操作類型“……”,請改用適用的接口的解決方法

問了度娘,解決方法如出一轍:選中項目中引入的dll,鼠標右鍵,選擇屬性,把“嵌入互操作類型”設置爲False。問題輕鬆解決後,應該有很多人糾結這個“嵌入互操作類型”到底是個什麼意思呢?下面讓我慢慢的道來。(如果你時間不多,直接看紅色字體部分)

軟件而言,互操作性——這條術語用來描述的是不同的程序(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 類型的類型信息。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章