10 Pregunta: El tipo de interoperabilidad no se puede incrustar

pregunta creada en Wed, Jun 3, 2015 12:00 AM

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

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

  

Tipo de interoperabilidad   'ActiveHomeScriptLib.ActiveHomeClass'   no se puede incrustar. Utilice el aplicable   interfaz 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é ocurre esto solo cuando uso el marco 4.0?

    
633
  1. He encontrado este artículo muy útil para resolver problemas de interoperabilidad /PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
    2015-07-29 15: 54: 35Z
10 Respuestas                              10                         

.NET 4.0 permite que los ensamblajes de interoperabilidad primarios (o, mejor dicho, los bits que necesita) estén incrustados en su ensamblaje para que no tenga que implementarlos junto con su aplicación.

Por cualquier motivo, este ensamblaje no se puede incrustar, pero parece que no es un problema para usted. Simplemente abra la pestaña Propiedades del ensamblaje en Visual Studio 2010 y configure "Incrustar tipos de interoperabilidad" en "Falso".

EDITAR: Consulte también respuesta de Michael Gustus, eliminando el sufijo Class de los tipos que está usando.

    
1011
2017-05-23 12: 10: 42Z
  1. Desafortunadamente, esto suena como lo que necesito, pero esta propiedad ya no parece estar disponible.
    2011-06-23 20: 34: 29Z
  2. Estaba buscando en la página de propiedades del Proyecto en lugar de hacer clic con el botón derecho | Propiedades en la DLL efectuada en el panel Referencias.
    2012-02-16 03: 35: 57Z
  3. ¿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 crear una instancia de 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 de BlahClass se llamó Blah, que parece ser la convención estándar.
    2012-04-19 16: 50: 48Z
  4. Una gran cosa acerca de la incrustación es que el ensamblaje Interop puede permanecer en CopyLocal = False, ya que no lo necesita en tiempo de ejecución.
    2012-05-07 13: 00: 03Z
  5. @ TimGoodman para mi "interfaz aplicable" no funcionaba, pero la configuración de la propiedad embed interop types antes mencionada a false funcionó. En mi caso, estaba trabajando con la biblioteca Microsoft.Office.Interop.Excel y necesitaba acceder al objeto Workbook. Usar la interfaz Workbook (por cierto, convención de nomenclatura ...) no era una opción; recibí COM object, no el Microsoft.Office.Interop.Excel.WorkbookClass deseado
    2016-09-09 12: 24: 41Z

En la mayoría de los casos, este error es el resultado de un 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();

Normalmente, en .NET 4 solo necesitas eliminar el sufijo 'Clase' y compilar el código:

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

Una explicación de MSDN es aquí .

    
460
2015-06-03 19: 54: 15Z
  1. + 1 Creo que esto es lo que el mensaje de error le está diciendo que haga cuando dice "usar la interfaz correspondiente". Tenga en cuenta que Excel.Application es una interfaz (a pesar de que se puede crear una instancia con la nueva palabra clave, similar a la situación que se describe aquí: stackoverflow.com/questions/6960910/… )
    2012-04-19 16: 58: 00Z
  2. "Incrustar tipos de interoperabilidad" a "False" o "True" ?
    2015-03-25 11: 47: 17Z
  3. @ Kiquenet. Si sigue los consejos que aparecen aquí, puede configurar 'Incrustar tipos de interoperabilidad' en True, o al menos eso funcionó bien para mí
    2015-09-03 11: 12: 39Z

Al igual que a Jan Me tomó un tiempo conseguirlo ... = S Así que para cualquier otra persona ciega de frustración.

  • Haga clic con el botón derecho en el conjunto infractor que agregó en el explorador de soluciones en su proyecto Referencias . (En mi caso WIA)
  • Haga clic en propiedades.
  • Y debería existir la opción para Incrustar ensamblaje de interoperabilidad.
  • Establézcalo en False
113
2012-01-19 09: 12: 46Z
  1. Aún 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 ¡b> la asamblea que estás construyendo!
    2011-07-01 16: 06: 43Z
  2. Ahora, (diez años después) esta opción se llama "Incrustar tipos de interoperabilidad"
    2019-03-06 19: 54: 07Z

Ampliando la respuesta correcta de Jon.

El problema aquí es que está combinando la nueva característica "Incrustar tipos de interoperabilidad" (o NoPIA) con el uso de un tipo de clase. La función "Incrustar tipos de interoperabilidad" funciona esencialmente mediante la vinculación estática de todos los tipos, desde un PIA (ensamblaje primario de interoperabilidad) al ensamblaje de referencia, lo que elimina la sobrecarga de su implementación.

Esta función 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 mantenimiento). Misha tiene un artículo detallado en el blog sobre por qué esto no está permitido

32
2010-03-20 17: 42: 41Z

Aquí es donde se establece la interoperabilidad de incrustación en Visual Studio 2012

 introduce la descripción de la imagen aquí

    
29
2017-04-27 01: 34: 01Z

Tengo la solución

Ir a las referencias, haga clic derecho en eldll deseado obtendrá la opción "Incrustar tipos de interoperabilidad" en "Falso" o "Verdadero".

    
12
2015-09-03 11: 14: 03Z
  1. Esto también funcionó para VS2015 c # con .net usando PP_COM_Wrapper; dado en cypress.com Cypress Semiconductor Corporation C # Lib ejemplo. Al establecer False, se eliminó el error.
    2016-06-01 16: 45: 16Z

Me encontré con este problema al desplegar un proyecto TFS en mi máquina local. Al parecer, 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 está funcionando como un campeón!

    
9
2016-01-12 15: 34: 54Z
  1. ¡Este enfoque también me funcionó! En mi caso, estaba depurando para encontrar dónde estaba el valor que necesitaba, al hacer clic derecho y seleccionar "copiar expresión". Lo que me dieron fue "... HTMLDocumentClass ..." Al eliminar el texto "Class" de la misma, se resolvió el problema por mí.
    2016-02-10 21: 22: 55Z

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

Proyecto VS 2013 VB.NET > Accesorios > Refs > Microsoft Word 12.0 Object Lib > Incrustar tipos de interoperabilidad: cambiar de verdadero a falso

    
2
2014-10-04 14: 23: 12Z

http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D002000000 /a>

Este error se produce porque el valor predeterminado es verdadero para la propiedad Incrustar tipos de interoperabilidad del ensamblado de interoperabilidad de 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 del ensamblaje de interoperabilidad de TestStand en la sección de referencias de su proyecto en el Explorador de soluciones. Busque la propiedad Incrustar tipos de interoperabilidad en el Explorador de propiedades y cambie el valor a Falso

    
1
2013-06-10 07: 57: 12Z

Visual Studio La versión 15.8 de 2017 hizo posible el uso de PackageReferencesyntax para hacer referencia a los paquetes NuGet en proyectos de Visual Studio Extensibility (VSIX). Esto hace que sea mucho más sencillo razonar acerca de los paquetes de NuGet y abre la puerta para tener un meta paquete completo que contenga todo el VSSDK.

La instalación a continuación del paquete NuGet resolverá el problema Incrustar tipos de inserción

  

Install-Package Microsoft.VisualStudio.SDK.EmbedInteropTypes

    
0
2019-06-19 05: 30: 07Z
fuente colocada aquí