tecnologia objects interfaces component .net com

.net - objects - tecnologia component object model



¿Los archivos*.tlb se usan alguna vez en tiempo de ejecución? (2)

Estaba enfrentando un problema al registrar el dll de .Net que estaba usando en el componente COM como referencias .tlb.

Por lo tanto, no es necesario registrar .Net dll (proyecto .tlb).

Espero que funcione.

Estoy trabajando en un producto que expone algunas API .NET a través de interoperabilidad COM. Como parte de la compilación, generamos archivos * .tlb para todos los ensamblados y los entregamos como parte de un paquete de SDK por separado. Nuestros clientes pueden instalar el SDK sobre nuestro producto y crear aplicaciones que utilicen nuestra COM API.

¿Necesitamos enviar y registrar esos archivos * .tlb con el producto mismo? ¿Hay una situación en la que se requieren * .tlb en tiempo de ejecución, cuando se ejecutan bibliotecas de terceros codificadas en su contra?

Explique cómo funciona si responde Sí. He visto muchos comentarios en Internet que dicen que tengo que entregarlos y registrarlos, pero no encontré ninguno que explique claramente por qué debería hacerse. Eso me hizo dudar de que sea cierto.


Sí, eso es posible Especialmente en el caso de .NET, no debe omitir el registro de la biblioteca de tipos porque no puede predecir cómo el código del cliente va a usar su servidor.

No son particularmente comunes, pero hay dos casos:

  • Cuando el código del cliente llama a su método [ComVisible] y la llamada cruza un límite de apartamento. Los apartamentos son un concepto COM que es un poco confuso, debes entender la diferencia entre los hilos STA y MTA. Manteniéndolo simple: un límite de apartamento se cruza típicamente cuando la llamada se hace desde otro hilo, desde otro proceso o desde otra máquina. COM necesita ayuda para descubrir cómo serializar los argumentos de la llamada en un paquete IPC y eso requiere conocer el tipo de argumentos. No existe un concepto de Reflection en COM, por lo que no se puede hacer fácilmente de forma automática. Se requiere una DLL separada que implementa el proxy y el código auxiliar, casi siempre generado a partir de un archivo IDL. Eso es difícil de conseguir en .NET, casi siempre usas la conveniente segunda vía, usando el Marshaller estándar integrado en Windows. Que usa una biblioteca de tipos para descubrir cuáles son los tipos de argumentos. La opción Regasm.exe / tlb asegura que la interfaz proxy / stub y la biblioteca de tipos estén registradas para que el marshaller estándar pueda encontrar la biblioteca.

  • Cuando expone una estructura en su interfaz pública. Las estructuras son muy problemáticas en escenarios de interoperabilidad, tienen un diseño que depende en gran medida de la configuración del compilador. La propiedad .NET equivalente es StructLayout.Pack. Corregido a 8 en .NET pero el código del cliente no lo sabe. Para acceder a una estructura, el código del cliente debe usar IRecordInfo. Lo que le permite descubrir dónde se encuentra cada campo de la estructura en la memoria. Una biblioteca de tipos proporciona la información que IRecordInfo necesita. Sin duda, lo mejor es evitar las estructuras completa y fácilmente en .NET.