C# 什么';Visual Studio中嵌入互操作类型的差异设置为true和false?

C# 什么';Visual Studio中嵌入互操作类型的差异设置为true和false?,c#,visual-studio,C#,Visual Studio,在Visual Studio中,向项目添加一个引用时,“属性”窗口有一个选项嵌入Inteop类型,我们应该将其设置为True还是False?有什么区别 由于我们有很多项目,其中一些项目的reference设置为False,其他项目的reference设置为True,这完全是一团糟。bulid服务器也有相同的警告: 因此,我们计划将所有嵌入Inteop类型更改为假,我们会面临什么风险 引入此选项是为了消除为互操作部署非常大的PIA(主互操作程序集)的需要 它只是嵌入了允许您与非托管程序集对话的托

在Visual Studio中,向项目添加一个引用时,“属性”窗口有一个选项
嵌入Inteop类型
,我们应该将其设置为
True
还是
False
?有什么区别

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


因此,我们计划将所有
嵌入Inteop类型
更改为
,我们会面临什么风险

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

它只是嵌入了允许您与非托管程序集对话的托管桥接代码,但它不是全部嵌入,而是只创建了您在代码中实际使用的内容

在Scott Hanselman的博客文章中阅读更多关于它和其他VS改进的内容

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


将它们全部设置为false的唯一风险是PIA文件的部署问题更多,如果其中一些文件较大,则部署范围更大。

我注意到,当设置为false时,我可以使用调试器查看项的值。
当设置为true时,我收到一个错误-item.FullName.GetValue嵌入的互操作类型“FullName”不包含“QBFC11Lib.IItemInventoryRet”的定义,因为它未在编译的程序集中使用。考虑将对象转换为“对象”或将“嵌入互操作类型”属性更改为true。 千万不要这样做,这是一个非常棒的特性,可以解决令人讨厌的部署细节。你必须了解COM才能真正了解这一切。@HansPassant,你是说永远不要将它们设置为
false
还是永远不要更改它们(例如,如果它们已经默认为
false
),他计划将其设置为false。永远不要这样做。@HansPassant你怎么会用“讨厌”和“恶心”呢。它非常脆:D@Mafii我以为格罗克来自一个陌生国度的陌生人(美国)。当然,这并不意味着英国人可能不会更多地使用它!请注意,在关闭嵌入互操作类型时,有一个相当显著的差异可能会破坏现有代码。其中提到了不同之处:“如果程序集由/link编译器选项引用,或者如果Excel嵌入互操作类型属性设置为true,则C#4和更高版本会自动将返回的对象转换为动态。true是此属性的默认值。”嵌入式互操作程序集在基于插件的系统中给我带来了麻烦,在这个系统中,主机和插件都依赖于同一个COM对象。另一个问题是将这些程序集与ILMerge合并。