El tipo de interoperabilidad no se puede incrustar

668

Estoy creando una aplicación web en .NET 4.0 framework (beta2) en C #.

Cuando intento usar un ensamblado llamado "ActiveHomeScriptLib", aparece el siguiente error:

El tipo de interoperabilidad 'ActiveHomeScriptLib.ActiveHomeClass' no se puede incrustar. Utilice la interfaz aplicable en su lugar.

Cuando cambio el marco a la versión 3.5, no tengo ningún error.

¿Qué es un tipo de interoperabilidad y por qué esto solo ocurre cuando uso el marco 4.0?

ene
fuente
Este artículo me pareció muy útil para resolver problemas de interoperabilidad / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Respuestas:

1069

.NET 4.0 permite que los ensamblados de interoperabilidad primarios (o más bien, los bits que necesita) se incrusten en su ensamblaje para que no necesite implementarlos junto con su aplicación.

Por alguna razón, este ensamblaje no se puede incrustar, pero parece que no es un problema para usted. Simplemente abra la pestaña Propiedades para el ensamblaje en Visual Studio 2010 y establezca "Incrustar tipos de interoperabilidad" en "Falso".

EDITAR: Vea también la respuesta de Michael Gustus , eliminando el Classsufijo de los tipos que está utilizando.

Jon Skeet
fuente
2
Desafortunadamente, esto suena justo como lo que necesito, pero esta propiedad ya no parece estar disponible.
Dave
130
Estaba buscando en la página de propiedades del proyecto en lugar del clic derecho | Propiedades en la DLL afectada en el panel Referencias.
justSteve
55
¿No tendría más sentido hacer lo que dice el error y "usar la interfaz correspondiente"? Tuve este error (de una clase diferente) y pude instanciar una interfaz que tenía esa clase especificada como su atributo CoClass, y funcionó. Como en la respuesta de Michael Gustus a continuación, la interfaz para BlahClass se llamaba simplemente Blah, que parece ser la convención estándar.
Tim Goodman
1
Una gran cosa acerca de la incrustación es que el ensamblaje de interoperabilidad puede seguir siendo CopyLocal = False, ya que no lo necesita en tiempo de ejecución.
Schmuli,
@TimGoodman para mí "interfaz aplicable" no funcionaba, pero la configuración de la embed interop typespropiedad mencionada anteriormente falsehizo el truco. En mi caso, estaba trabajando con la Microsoft.Office.Interop.Excelbiblioteca y necesitaba acceder al objeto Workbook. Usar su interfaz Workbook(por cierto, convención de nomenclatura ...) no era una opción. Recibí COM object, no el deseadoMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
485

En la mayoría de los casos, este error es el resultado del código que intenta crear una instancia de un objeto COM. Por ejemplo, aquí hay un código que inicia Excel:

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

Por lo general, en .NET 4 solo necesita eliminar el sufijo 'Clase' y compilar el código:

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

Una explicación de MSDN está aquí .

Michael Gustus
fuente
16
+1 Creo que esto es lo que el mensaje de error te dice que hagas cuando dice "usa la interfaz correspondiente". Tenga en cuenta que Excel.Application es una interfaz (a pesar de que se puede instanciar con la nueva palabra clave, similar a la situación descrita aquí: stackoverflow.com/questions/6960910/… )
Tim Goodman
¿"Incrustar tipos de interoperabilidad" en "Falso" o "Verdadero" ?
Kiquenet
1
@Kiquenet si sigues los consejos aquí, puedes volver a configurar los 'Tipos de interoperabilidad de incrustación', o al menos eso funcionó bien para mí
Sam Holder
122

Como Jan Me tomó un tiempo entenderlo ... = S Entonces, para cualquier otra persona cegada por la frustración.

  • Haga clic derecho en el ensamblaje ofensivo que agregó en el explorador de soluciones en las referencias de su proyecto . (En mi caso WIA)
  • Haga clic en propiedades.
  • Y debería haber la opción allí para incrustar ensamblado de interoperabilidad.
  • Establecerlo en falso
Gedeón
fuente
15
Todavía estoy luchando hasta que me di cuenta de que tenía que hacer clic con el botón derecho en el ensamblaje de interoperabilidad en las referencias del proyecto en el Explorador de soluciones, ¡ NO en el ensamblaje que está creando!
SteveWilkinson 01 de
2
Ahora, (diez años después) esta opción se llama "Tipos de interoperabilidad de incrustación"
David Foley
36

Aquí es donde configurar la interoperabilidad de inserción en Visual Studio 2012

ingrese la descripción de la imagen aquí

VK_217
fuente
34

Ampliando la respuesta correcta de Jon.

El problema aquí es que está combinando la nueva función "Tipos de interoperabilidad de incrustación" (o NoPIA) con el uso de un tipo de clase. La función "Insertar tipos de interoperabilidad" funciona esencialmente vinculando estáticamente todos los tipos de un PIA (ensamblado de interoperabilidad primario) en el ensamblaje de referencia eliminando la sobrecarga de desplegarlo.

Esta característica funciona muy bien para la mayoría de los tipos en un PIA, pero tiene restricciones. Una de ellas es que no puede incrustar clases (es un problema de servicio). Misha tiene un artículo de blog detallado sobre por qué esto no está permitido

JaredPar
fuente
15

Tengo la solución

Vaya a referencias, haga clic con el botón derecho en la dll deseada y obtendrá la opción "Incrustar tipos de interoperabilidad" en "Falso" o "Verdadero".

Navdeep
fuente
1
Esto también funcionó para VS2015 c # con .net usando PP_COM_Wrapper; dado en cypress.com Ejemplo de Cypress Semiconductor Corporation C # Lib. Establecer en False eliminó el error.
user3564895
9

Me encontré con este problema al desplegar un proyecto TFS en mi máquina local. Supuestamente, estaba funcionando bien en la máquina del tipo que lo escribió. Simplemente cambié esto ...

WshShellClass shellClass = new WshShellClass();

A esto...

WshShell shellClass = new WshShell();

¡Ahora funciona como un campeón!

Zach
fuente
1
¡Este enfoque también funcionó para mí! En mi caso, estaba depurando para encontrar dónde estaba el valor que necesitaba, hice clic derecho y seleccioné "copiar expresión". Lo que me dieron fue "... HTMLDocumentClass ..." Eliminar el texto "Clase" de él resolvió el problema para mí.
majestzim
3

Tuve el mismo problema en VB.NET 2013 con Office 2007, y esto lo resolvió:

Proyecto VS 2013 VB.NET> Props> Refs> Microsoft Word 12.0 Object Lib> Tipos de interoperabilidad de incrustación: cambie True a False

Doug Null
fuente
1

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

Este error se produce porque el valor predeterminado es verdadero para la propiedad Tipos de interoperabilidad de incrustación del ensamblaje de interoperabilidad API TestStand al que se hace referencia en el nuevo proyecto. Para resolver este error, cambie el valor de la propiedad Incrustar tipos de interoperabilidad a Falso siguiendo estos pasos: Seleccione la referencia TestStand Interop Assembly en la sección de referencias de su proyecto en el Explorador de soluciones. Busque la propiedad Tipos de interoperabilidad de incrustación en el Explorador de propiedades y cambie el valor a Falso

Ramezani r
fuente
1

Visual Studio 2017 versión 15.8 hizo posible utilizar la sintaxis PackageReferences para hacer referencia a paquetes NuGet en proyectos de Visual Studio Extensibility (VSIX). Esto hace que sea mucho más simple razonar sobre los paquetes NuGet y abre la puerta para tener un metapaquete completo que contenga todo el VSSDK.

La instalación a continuación del paquete NuGet resolverá el problema EmbedInteropTypes .

Install-Package Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
fuente