Qual é a diferença de definir os tipos de interoperabilidade incorporados true e false no Visual Studio?
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?
— Jerry Bian
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.
@HansPassant, você está dizendo para nunca defini-los falseou nunca alterá-los (por exemplo, se eles falsejá estiverem no padrão )?
Ele planeja definir como False. Nunca faça isso.
@HansPassant, como você usa irritante e grok. é muito brittish: D
— Mafii
@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
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:
Verifique o sinalizador de Tipos de interoperabilidade incorporados ao fazer o trabalho de extensibilidade do Visual Studio
A dor de implantar assemblies de interoperabilidade primários
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.
— Adam Houldsworth
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
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.