Qual é a diferença de definir os tipos de interoperabilidade incorporados true e false no Visual Studio?


121

No Visual Studio, ao adicionar uma referência ao projeto, a janela de propriedades tem uma opção Embed Inteop Types, devemos defini-la como Trueou False? Qual é a diferença?

Como temos muitos projetos, entre alguns deles, foi definido como referência False, outros foram definidos como True, é uma bagunça total. E o servidor bulid também tem os mesmos avisos:

O que significa “referência foi criada para assembly de interoperabilidade incorporado”?

Portanto, planejamos mudar todos os Embed Inteop Typespara False, que risco teríamos?


4
Nunca faça isso, é um recurso incrível que resolve detalhes de implantação enfadonhos. Você tem que entender COM para realmente entender o que está acontecendo.
Hans Passant

@HansPassant, você está dizendo para nunca defini-los falseou nunca alterá-los (por exemplo, se eles falsejá estiverem no padrão )?
noelicus

2
Ele planeja definir como False. Nunca faça isso.
Hans Passant

3
@HansPassant, como você usa irritante e grok. é muito brittish: D
Mafii

4
@Mafii Achei que grok fosse de Stranger in a Strange Land (que é americano). Não significa que os britânicos não o usem mais, claro!
UuDdLrLrSs

Respostas:


79

Esta opção foi introduzida para remover a necessidade de implantar PIAs (Primary Interop Assemblies) muito grandes para interoperabilidade.

Ele simplesmente incorpora o código de ponte gerenciado usado que permite que você converse com assemblies não gerenciados, mas em vez de incorporar tudo, ele apenas cria o que você realmente usa no código.

Leia mais na postagem do blog de Scott Hanselman sobre isso e outras melhorias do VS aqui .

Quanto a se é aconselhável ou não, não tenho certeza, pois não preciso usar esse recurso. Uma rápida pesquisa na web rende alguns leads:

O único risco de transformá-los todos em falsos é mais questões de implantação com arquivos PIA e uma implantação maior se alguns desses arquivos forem grandes.


1
Observe que há uma diferença bastante significativa que pode quebrar o código existente ao desativar os Tipos de interoperabilidade incorporados . A diferença é mencionada aqui : “C # 4 e versões posteriores convertem o Objeto retornado em dinâmico automaticamente se o assembly for referenciado pela opção de compilador / link ou, de forma equivalente, se a propriedade Tipos de interoperabilidade incorporados do Excel estiver definida como true. True é o valor padrão para esta propriedade. ”
Dirk Vollmar

Os assemblies de interoperabilidade incorporados me deram problemas em um sistema baseado em plug-in, no qual o host e os plug-ins dependiam do mesmo objeto COM . Outro problema foi mesclar esses assemblies com ILMerge .
Ant_222

8

Percebi que, quando está definido como false, posso ver o valor de um item usando o depurador. Quando estava definido como true, recebia um erro - item.FullName.GetValue O tipo de interoperabilidade incorporado 'FullName' não contém uma definição para 'QBFC11Lib.IItemInventoryRet', pois não foi usado no assembly compilado. Considere converter em objeto ou alterar a propriedade 'Embed Interop Types' para true.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.