¿Cuál es la diferencia entre la configuración de Incrustar tipos de interoperabilidad verdadero y falso en Visual Studio?

121

En Visual Studio, al agregar una referencia al proyecto, la ventana de propiedades tiene una opción Embed Inteop Types, ¿deberíamos establecerla en Trueo False? ¿Cual es la diferencia?

Como tenemos muchos proyectos, entre algunos de ellos, se estableció una referencia False, otros se establecieron True, es un desastre total. Y el servidor bulid también tiene las mismas advertencias:

¿Qué significa “se creó una referencia a un ensamblado de interoperabilidad integrado”?

Así que planeamos cambiar todo el Embed Inteop Typesa False, ¿qué riesgo correríamos?

Jerry Bian
fuente
4
Nunca hagas esto, es una característica increíble que resuelve molestos detalles de implementación. Tienes que entender COM para realmente asimilar de qué se trata todo esto.
Hans Passant
@HansPassant, ¿está diciendo que nunca los configure falseo nunca los cambie (por ejemplo, si ya están predeterminados false)?
noelicus
2
Planea ponerlo en Falso. Nunca hagas esto.
Hans Passant
3
@HansPassant ¿cómo es que usas fastidiar y grok? es muy británico: D
Mafii
4
@Mafii Pensé que grok era de Stranger in a Strange Land (que es estadounidense). ¡No significa que los británicos no lo usen más, por supuesto!
UuDdLrLrSs

Respuestas:

79

Esta opción se introdujo para eliminar la necesidad de implementar PIA (ensamblados de interoperabilidad primarios) muy grandes para la interoperabilidad.

Simplemente incrusta el código de puente administrado utilizado que le permite hablar con ensamblados no administrados, pero en lugar de incrustarlo todo, solo crea las cosas que realmente usa en el código.

Lea más en la publicación del blog de Scott Hanselman sobre esto y otras mejoras de VS aquí .

En cuanto a si se recomienda o no, no estoy seguro, ya que no necesito usar esta función. Una búsqueda rápida en la web arroja algunas pistas:

El único riesgo de convertirlos a todos en falsos es más preocupaciones de implementación con archivos PIA y una implementación más grande si algunos de esos archivos son grandes.

Adam Houldsworth
fuente
1
Tenga en cuenta que hay una diferencia bastante significativa que puede romper el código existente al desactivar Incrustar tipos de interoperabilidad . La diferencia se menciona aquí : “C # 4, y las versiones posteriores, convierten el objeto devuelto en dinámico automáticamente si la opción del compilador / link hace referencia al ensamblado o, de manera equivalente, si la propiedad Tipos de interoperabilidad incrustados de Excel se establece en verdadero. Verdadero es el valor predeterminado para esta propiedad ".
Dirk Vollmar
Los ensamblados de interoperabilidad integrados me dieron problemas en un sistema basado en complementos, en el que tanto el host como los complementos dependían del mismo objeto COM . Otro problema fue la fusión de estos ensamblados con ILMerge .
Ant_222
8

Me di cuenta de que cuando se establece en falso, puedo ver el valor de un elemento usando el depurador. Cuando se estableció en verdadero, recibí un error: item.FullName.GetValue El tipo de interoperabilidad incrustado 'FullName' no contiene una definición para 'QBFC11Lib.IItemInventoryRet' ya que no se usó en el ensamblado compilado. Considere la posibilidad de convertir a un objeto o cambiar la propiedad 'Incrustar tipos de interoperabilidad' a true.

user890332
fuente