O tipo de interoperabilidade não pode ser incorporado

668

Estou criando um aplicativo Web na estrutura .NET 4.0 (beta2) em C #.

Quando tento usar um assembly chamado "ActiveHomeScriptLib", recebo o seguinte erro:

O tipo de interoperabilidade 'ActiveHomeScriptLib.ActiveHomeClass' não pode ser incorporado. Use a interface aplicável.

Quando altero a estrutura para a versão 3.5, não tenho erros.

O que é um tipo de interoperabilidade e por que isso ocorre apenas quando uso a estrutura 4.0?

Jan
fonte
Eu achei este artigo muito útil para resolver problemas de interoperabilidade / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton 29/07

Respostas:

1069

O .NET 4.0 permite que os assemblies de interoperabilidade primários (ou melhor, os bits necessários) sejam incorporados ao seu assembly para que você não precise implantá-los junto ao seu aplicativo.

Por qualquer motivo, esta montagem não pode ser incorporada - mas parece que isso não é um problema para você. Basta abrir a guia Propriedades do assembly no Visual Studio 2010 e defina "Tipos de interoperabilidade incorporados" como "Falso".

Edição: Veja também a resposta de Michael Gustus , removendo o Classsufixo dos tipos que você está usando.

Jon Skeet
fonte
2
Infelizmente, isso parece exatamente o que eu preciso, mas essa propriedade não parece mais estar disponível.
Dave
130
Eu estava procurando na página de propriedades do projeto, em vez de clicar com o botão direito do mouse em | Propriedades na DLL efetuada no painel Referências.
justSteve
5
Não faria mais sentido fazer o que o erro diz e "usar a interface aplicável"? Eu tive esse erro (de uma classe diferente) e fui capaz de instanciar uma interface que tivesse essa classe especificada como seu atributo CoClass, e funcionou. Como na resposta de Michael Gustus abaixo, a interface do BlahClass foi chamada de Blah, que parece ser a convenção padrão.
21712 Tim
1
Uma grande coisa sobre a incorporação é que o assembly Interop pode permanecer CopyLocal = False, pois você não precisa dele em tempo de execução.
Schmuli
O @ TimGoodman para mim "interface aplicável" não estava funcionando, mas a configuração da embed interop typespropriedade acima mencionada falsefez o truque. No meu caso - eu estava trabalhando com a Microsoft.Office.Interop.Excelbiblioteca e precisava acessar o objeto Pasta de Trabalho. Usando sua interface Workbook(btw convenção de nomenclatura ....) Não foi uma opção - eu recebi COM object, e não o desejadoMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
485

Na maioria dos casos, esse erro é o resultado do código que tenta instanciar um objeto COM. Por exemplo, aqui está um pedaço de código que inicia o Excel:

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();

Normalmente, no .NET 4, você só precisa remover o sufixo 'Class' e compilar o código:

Excel.Application xlapp = new Excel.Application();

Uma explicação do MSDN está aqui .

Michael Gustus
fonte
16
+1 Eu acredito que é isso que a mensagem de erro está realmente dizendo para você fazer quando diz "usar a interface aplicável". Note-se que Excel.Application é uma interface (apesar do fato de que ele pode ser instanciado com a nova palavra-chave, similar à situação descrita aqui: stackoverflow.com/questions/6960910/... )
Tim Goodman
"Incorporar tipos de interoperabilidade" a "Falso" ou "Verdadeiro" ?
Kiquenet 25/03
1
@Kiquenet se você seguir o conselho aqui você pode definir o back 'Embed Interop Types' como True, ou pelo menos que funcionou bem para mim
Sam Titular
122

Como Jan Demorei um pouco para obtê-lo .. = S Então, para qualquer pessoa que esteja cega de frustração.

  • Clique com o botão direito do mouse no assembly incorreto que você adicionou no explorador de soluções em Referências ao seu projeto . (No meu caso WIA)
  • Clique em propriedades.
  • E deve haver a opção lá para Incorporar montagem de interoperabilidade.
  • Defina como Falso
gideon
fonte
15
Ainda lutando até perceber que você tinha que clicar com o botão direito do mouse no assembly de interoperabilidade sob o projeto Referências no Solution Explorer, NÃO no assembly que você está construindo!
SteveWilkinson
2
Agora, (dez anos mais tarde) esta opção é chamado de "Tipos Embed Interop"
David Foley
36

Aqui é onde definir a interoperabilidade de incorporação no Visual Studio 2012

insira a descrição da imagem aqui

VK_217
fonte
34

Expandindo a resposta correta de Jon.

O problema aqui é que você está combinando o novo recurso "Incorporar tipos de interoperabilidade" (ou NoPIA) com o uso de um tipo de classe. O recurso "Incorporar tipos de interoperabilidade" funciona vinculando essencialmente estaticamente em todos os tipos de um PIA (Primary Interop Assembly) ao assembly de referência, removendo a sobrecarga de sua implantação.

Esse recurso funciona muito bem para a maioria dos tipos em uma PIA, mas possui restrições. Uma delas é que você não pode incorporar classes (é um problema de manutenção). Misha tem um artigo de blog detalhado sobre por que isso não é permitido

JaredPar
fonte
15

Tem a solução

Vá para as referências, clique com o botão direito do mouse na dll desejada e você receberá a opção "Incorporar tipos de interoperabilidade" para "Falso" ou "Verdadeiro".

Navdeep
fonte
1
Isso também funcionou para o VS2015 c # com .net usando PP_COM_Wrapper; dado em cypress.com Cypress Semiconductor Corporation Exemplo C # Lib. Definir como False se livrou do erro.
user3564895
9

Corri para esse problema ao puxar um projeto TFS para a minha máquina local. Alegadamente, estava funcionando bem na máquina do cara que a escreveu. Eu simplesmente mudei isso ...

WshShellClass shellClass = new WshShellClass();

Para isso...

WshShell shellClass = new WshShell();

Agora, está funcionando como um campeão!

Zach
fonte
1
Essa abordagem funcionou para mim também! No meu caso, eu estava depurando para descobrir onde estava o valor necessário, clicar com o botão direito do mouse e selecionar "copiar expressão". O que me foi dado foi "... HTMLDocumentClass ..." A remoção do texto "Classe" dele resolveu o problema para mim.
majestzim
3

Eu tive o mesmo problema no VB.NET 2013 com o Office 2007, e isso resolveu:

Projeto 2013 do VB.NET do VS 2013> Props> Refs> Lib de objeto do Microsoft Word 12.0> Tipos de interoperabilidade de incorporação: alterar verdadeiro para falso

Doug Null
fonte
1

http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D0071F307

Este erro ocorre porque o valor padrão é verdadeiro para a propriedade Tipos de interoperabilidade incorporada do assembly de interoperabilidade da API TestStand mencionado no novo projeto. Para resolver esse erro, altere o valor da propriedade Incorporar tipos de interoperabilidade para Falso, seguindo estas etapas: Selecione a referência TestStand Interop Assembly na seção de referências do seu projeto no Solution Explorer. Localize a propriedade Incorporar tipos de interoperabilidade no Navegador de propriedades e altere o valor para Falso

Ramezani r
fonte
1

O Visual Studio 2017 versão 15.8 tornou possível usar a sintaxe PackageReferences para referenciar pacotes NuGet em projetos do Visual Studio Extensibility (VSIX). Isso torna muito mais simples o raciocínio sobre os pacotes NuGet e abre a porta para ter um meta pacote completo contendo o VSSDK inteiro.

A instalação abaixo do pacote NuGet resolverá o problema de EmbedInteropTypes .

Pacote de instalação Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
fonte