2009-10-29 26 views
7

Estamos trabajando en una integración de una aplicación grande basada en MFC con un puñado de complementos administrados (.NET). La comunicación con estos complementos se realiza a través de COM.Ensamblados dependientes y de interoperabilidad COM sin registro

Históricamente, acabamos de utilizar el registro para hacer estos complementos disponibles (como servidores COM) para la aplicación. Pero, ahora estamos tratando de usar interoperabilidad COM libre de registro para hacer esto.

Nos gustaría que estos complementos puedan vivir en un directorio separado del que ejecuta la aplicación, idealmente en cualquier lugar. Pero, aparentemente estamos teniendo problemas con la creación de instancias de los objetos del servidor debido a la incapacidad de resolver ensamblajes dependientes, que también viven en el directorio con la DLL del servidor COM.

La interoperabilidad COM "pasada de moda" manejó esto usando un contexto LoadFrom cuando cargó el ensamblado de destino. Pero el mecanismo de contexto de activación no parece hacer esto.

¿Alguien sabe cómo hacerlo funcionar? No está claro si podemos identificar ensamblajes dependientes en el manifiesto SxS del módulo, o quizás podemos crear el contexto de activación de manera diferente.

¡Gracias por cualquier pensamiento/sugerencia!

Jeff

+0

¿Ha encontrado una solución a that'? – RayOldProf

Respuesta

1

Esperanza entiendo el problema ya que no estoy tan familiarizado con un proyecto MFC Es ni limitaciones. ¿Qué tal una clase .NET "bien conocida" con una interfaz (registrada permanentemente con la aplicación MFC) que, a su vez, maneja todas las activaciones y las instancias?

Rodney

+2

Esto es realmente una solución que ha sido exitosa: creamos un módulo C++/CLI, que PUEDE ser activado de forma gratuita, y lo usamos para instanciar la clase C#. Para que esto funcione, también necesitamos configurar un manejador de eventos AssemblyResolve, para que se puedan ubicar los ensamblados dependientes en el mismo directorio. Esto está bien, pero es un poco torpe. Parece que esto debería ser capaz de funcionar sin este nivel adicional de indirección. – Jeff

-1

¿Se ha registrado dlls intermediados (interoperabilidad) con .NET Framework?

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ regasm "camino .. \ AxInterop.xxx.dll" o C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ regasm "camino .. \ Interop.xxx.dll"

Saludos Phani

+2

Gracias por el comentario, Phani. El objetivo de intentar esto es evitar el registro. – Jeff

0

Cuando miro el artículo en Simplify App Deployment with ClickOnce and Registration-Free COM observo que hacen referencia al nombre de archivo del registro gratuito DLL objeto COM en el manifiesto de aplicación. Supongo que este nombre de archivo podría cambiarse para incluir un directorio o algo así.

En segundo lugar, en la sección "Un ejemplo más complejo", incluyen objetos COM dependientes como referencias a su proyecto y los establece como aislados. Es decir, ahora también están libres de registro. Mi suposición es que su camino también podría ser actualizado.

+0

Realmente no tenemos el lujo de modificar el manifiesto de la aplicación, ya que los ensamblados que se cargan aquí son "complementos", y pueden agregarse después del hecho. Es posible que hacer algo más en el manifiesto del módulo sea la respuesta aquí, pero nada de lo que hayamos probado ha funcionado, parece ser "solo" un problema con los algoritmos de carga de .NET. – Jeff

-1

abrir el símbolo del sistema de Visual Studio y tratar de registrar su conjunto usando regasm

regasm /tlb:"path" 
+3

Como menciono anteriormente, no queremos registrar nada. Esto incluiría la biblioteca de tipos. Además, en este caso, la biblioteca de tipos para la interfaz que estamos implementando ya está registrada. – Jeff

Cuestiones relacionadas