2013-12-11 37 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。

相关问题