2010-03-20 111 views
559

Estoy creando una aplicación web en .NET 4.0 framework (beta2) en C#.El tipo de interoperabilidad no se puede incrustar

Cuando trato de usar un montaje llamado "ActiveHomeScriptLib", me sale el siguiente error:

Interop type 'ActiveHomeScriptLib.ActiveHomeClass' cannot be embedded. Use the applicable interface instead.

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

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

+0

he encontrado este artículo muy útil para resolver problemas de interoperabilidad/PIA. http://blogs.msdn.com/b/vbteam/archive/2010/06/11/troubleshooting-errors-when-embedding-type-information-doug-rothaus.aspx – GilesDMiddleton

Respuesta

896

.NET 4.0 permite ensambles primarios de interoperabilidad (o más bien, los bits que se necesitan) para incrustarlos en su conjunto, de modo que no tenga que implementarlos junto con su aplicación.

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

EDITAR: Vea también answer de Michael Gustus, eliminando el sufijo Class de los tipos que está utilizando.

+1

Desafortunadamente, esto suena exactamente como lo que necesito, pero esta propiedad ya no parece estar disponible. – Dave

+94

Estaba buscando en la página de propiedades del proyecto en lugar de hacer clic con el botón derecho | Propiedades en la DLL afectada en el panel Referencias. – justSteve

+1

¿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 para BlahClass se llamaba Blah, que parece ser la convención estándar. –

31

Expandiendo la respuesta correcta de Jon.

El problema aquí es que estás combinando la nueva característica "Insertar tipos de interoperabilidad" (o NoPIA) con el uso de un tipo de clase. La función "Incrustar tipos de interoperabilidad" funciona esencialmente enlazando estáticamente en todos los tipos desde un PIA (conjunto de interoperabilidad primario) al conjunto de referencia, eliminando la sobrecarga de su implementación.

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 mantenimiento). Misha tiene un artículo de blog detallada sobre por qué esto no está permitido

98

como Jan Me tomó un tiempo para conseguirlo .. = S Así que para cualquier otra persona que está cegado por la frustración.

  • Haga clic derecho en el conjunto del infractor que agregó en el explorador de soluciones bajo su proyecto Referencias. (En mi caso WIA)
  • Haga clic en Propiedades.
  • Y debería haber la opción allí para Embedded Interop Assembly.
  • ponemos a false
+14

Todavía estoy luchando hasta que me di cuenta de que tenía que ** hacer clic con el botón derecho en el ensamblado de interoperabilidad ** bajo el proyecto Referencias en el Explorador de soluciones ** ¡NO el ensamblaje que está construyendo! – SteveWilkinson

415

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

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

Típicamente, en .NET 4 sólo tiene que eliminar el sufijo 'Clase' y compilar el código:

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

Un MSDN la explicación es here.

+10

+1 Creo que esto es lo que el mensaje de error realmente le dice que haga cuando dice "use 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í: http: // stackoverflow.com/questions/6960910/what-do-the-c-sharp-coclass-attribute-do) –

+0

_ "Incrustar tipos de interoperabilidad" _ a ** "Falso" ** o ** "Verdadero" **? – Kiquenet

+1

@Kiquenet si sigues los consejos aquí, puedes configurar los 'Tipos de interoperación incrustados' en True, o al menos eso funcionó bien para mí –

12

Tienes la solución

Ir a las referencias haga clic derecho en el archivo DLL deseada obtendrá opción "Insertar Tipos de interoperabilidad" a "falso" o "verdadero".

+1

Esto también funcionó para VS2015 C# con .net usando PP_COM_Wrapper; dado en http://www.cypress.com Ejemplo de Cypress Semiconductor Corporation C# Lib. La configuración en False eliminó el error. – user3564895

1

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

Este error se produce porque el valor predeterminado es cierto para los tipos de propiedad Insertar interoperabilidad del conjunto de TestStand API de interoperabilidad que se hace referencia en el nuevo proyecto. Para resolver este error, cambie el valor de la propiedad Insertar tipos de interoperabilidad a Falso siguiendo estos pasos: Seleccione la referencia Conjunto de interpolación TestStand en la sección de referencias de su proyecto en el Explorador de soluciones. Encuentra la propiedad Insertar Tipos de interoperabilidad en el Explorador de propiedades, y cambiar el valor en False

2

que tenía el mismo problema en VB.NET 2013 con Office 2007, y esto lo resolvió:

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

7

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

WshShellClass shellClass = new WshShellClass(); 

Para esto ...

WshShell shellClass = new WshShell(); 

Ahora, se está trabajando como un campeón!

+1

Este enfoque funcionó para mí también! En mi caso, estaba depurando para encontrar el valor que necesitaba, hice clic con el botón derecho y seleccioné "copiar expresión". Lo que se me dio fue "... HTMLDocumentClass ..." Eliminar el texto "Class" de él resolvió el problema para mí. – majestzim

17

Aquí es donde para establecer la interoperabilidad Insertar en Visual Studio 2012

enter image description here

Cuestiones relacionadas