2013-12-11 76 views
82

在Visual Studio中,向項目添加一個引用時,屬性窗口有一個選項Embed Inteop Types,我們是否應該將其設置爲TrueFalse?有什麼不同?在Visual Studio中設置Embed Interop Types true和false有什麼區別?

由於我們有很多項目,其中一些參考設置爲False,其他設置爲True,這完全搞砸了。而bulid服務器也有同樣的警告:

What does 「reference was created to embedded interop assembly」 mean?

所以我們打算改變所有Embed Inteop TypesFalse,我們會得到什麼樣的風險?

+3

永遠不要這樣做,它是一個非常棒的功能,可以解決令人厭煩的部署細節。你必須理解COM才能真正理解這是怎麼回事。 –

+0

@HansPassant,你是說永遠不要將它們設置爲'false'或永遠不要改變它們(例如,如果它們已經默認爲'false')? – noelicus

+1

他計劃將其設置爲False。永遠不要這樣做。 –

回答

55

引入此選項是爲了消除爲interop部署非常大的PIA(主互操作程序集)的需要。

它只是嵌入使用的託管橋接代碼,允許您與非託管程序集進行通信,但不是嵌入它,而是隻創建實際在代碼中使用的內容。

閱讀更多關於Scott Hanselman的博客文章以及其他VS的改進here

至於是否建議,我不確定,因爲我不需要使用此功能。一個快速的網絡搜索產生了一些線索:

他們都轉向假的唯一的風險是PIA文件的詳細部署的關注和更大規模的部署,如果一些人的文件很大。

+1

請注意,在將* Embed Interop Types *關閉時,可能會破壞現有代碼,這是相當顯着的差異。不同的是[這裏]提到(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/how-to-access-office-onterop-objects):*「C#4,及更高版本,如果程序集由/ link編譯器選項引用,或者等效地將Excel Embed Interop Types屬性設置爲true,則將返回的對象自動轉換爲動態。 True是此屬性的默認值。「* –

6

我注意到,當它設置爲false時,我能夠使用調試器查看項目的值。 當它被設置爲true時,我得到一個錯誤 - item.FullName.GetValue嵌入式互操作類型'FullName'不包含'QBFC11Lib.IItemInventoryRet'的定義,因爲它在編譯的程序集中未使用。考慮轉換爲對象或將「嵌入互操作類型」屬性更改爲true。

相關問題