在Visual Studio中将“嵌入互操作类型”设置为true和false有什么区别?


121

在Visual Studio中,当向项目添加一个引用时,属性窗口具有选项Embed Inteop Types,如果我们将其设置为TrueFalse?有什么不同?

由于我们有很多项目,其中有些项目的参考设置为False,其他项目的设置为True,这完全是一团糟。bulid服务器也有相同的警告:

“创建对嵌入式互操作程序集的引用”是什么意思?

因此,我们计划将所有更改Embed Inteop TypesFalse,我们会遇到什么风险?


4
永远不要这样做,它是一个非常棒的功能,可以解决令人讨厌的部署细节。您必须了解COM才能真正了解其中的全部内容。
汉斯·帕桑

@HansPassant,您是说从不设置false或更改它们(例如,如果它们默认为false已经存在)?
noelicus 2014年

2
他计划将其设置为False。永远不要这样做。
Hans Passant 2014年

3
@HansPassant您如何使用令人讨厌和古怪的东西。:D
Mafii '16

4
@Mafii我以为grok来自陌生之地(美国)的陌生人。当然,这并不意味着英国人可能不会再使用它!
UuDdLrLrSs

Answers:


79

引入此选项是为了不需要为互操作部署非常大的PIA(主互操作程序集)。

它只是嵌入所使用的托管桥接代码,该代码使您可以与非托管程序集进行通信,但不是全部嵌入,而是仅创建您在代码中实际使用的东西。

可以在Scott Hanselman的博客文章中了解有关它以及其他VS改进的更多信息

至于是否建议,我不确定,因为我不需要使用此功能。快速的网络搜索产生了一些线索:

将它们全部置为假的唯一风险是,与PIA文件有关的部署问题更多,而如果其中一些文件很大,则涉及更大的部署问题。


1
请注意,当关闭“ 嵌入互操作类型”时,有一个相当大的差异可能会破坏现有代码。这里提到区别:“ C#4和更高版本,如果/ link编译器选项引用了程序集,或者等效地,如果Excel Embed Interop Types属性设置为true,则将返回的对象自动转换为动态对象。此属性的默认值为True。”
Dirk Vollmar '18

嵌入式互操作程序集在基于插件的系统中给我带来麻烦,在该系统中,主机和插件都依赖于同一COM对象。另一个问题是将此类程序集与ILMerge合并。
Ant_222

8

我注意到,将其设置为false时,我可以使用调试器查看项目的值。将其设置为true时,出现错误-item.FullName.GetValue嵌入式互操作类型'FullName'不包含'QBFC11Lib.IItemInventoryRet'的定义,因为未在编译的程序集中使用它。考虑转换为对象或将“嵌入互操作类型”属性更改为true。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.