2008-12-11 15 views
22

Tengo un servidor x64 que, como mis bibliotecas están compiladas en AnyCPU, se ejecuta bajo x64. Necesitamos acceder a un componente COM que está registrado en x86. No sé lo suficiente sobre COM y mis búsquedas de Google no me llevan a ninguna parte.Acceso COM x86 desde x64 .NET

Pregunta: ¿Puedo usar un enlace de registro simbólico de x64 a x86 para el componente COM? ¿Debo registrar también el componente COM en x64? ¿Puedo (cualquier declaración aquí ...)?

Gracias.

Respuesta

26

Si un componente se está ejecutando x64-native, no puede cargar un servidor COM de 32 bits en proceso, porque es el tipo de proceso incorrecto. Hay un par de soluciones posibles:

  1. Si es posible, construir una versión de 64 bits del código COM (lo que, por supuesto, podría registrar en el registro de 64 bits). Esta es la solución más limpia, pero puede no ser posible si no tiene el código para el servidor COM.

  2. Ejecute su componente .NET como 32-bit x86, en lugar de x64. Supongo que ya ha considerado y rechazado este por alguna razón.

  3. Aloje el componente COM fuera del proceso mediante el archivo COM surrogate DLLhost.exe. Esto hará que las llamadas al servidor COM sean mucho, mucho más lentas (ahora interprocesarán los mensajes de Windows en lugar de las llamadas a funciones nativas), pero de lo contrario será transparente (no tiene que hacer nada especial).

    Esto probablemente no sea una opción si el servidor requiere un proxy-trozo personalizado en lugar de usar el normal oleaut32 (aunque muy raro), ya que no habrá disponible una versión de 64 bits del proxy . Siempre que pueda usar el ordenamiento OLE ordinario, puede simplemente register it for surrogate activation.

+0

# 1 no es posible ya que no hay una versión x64. # 2 anula el propósito de ejecutar en x64. # 3 funcionó muy bien. Podemos vivir con los éxitos de rendimiento aquí hasta que obtengamos una nueva versión de la biblioteca. Gracias por tu ayuda. –

2

Es el componente COM está alojado en un servidor COM (es decir, un proceso independiente), entonces usted no tendrá que hacer nada especial como el subsistema COM se remota a sus llamadas desde su aplicación de 64 bits a la aplicación X86 y de nuevo.

Si su componente es un componente COM en proceso, entonces tendrá que replantearse las cosas, ya que un proceso de 64 bits no puede usar 32 bits en los componentes COM del proceso. Podría forzar a su servidor a ejecutarse bajo x86 para que pueda acceder a los componentes (ambos serán procesos de 32 bits). Si no desea hacer esto, deberá ver si hay una versión de x64 de los componentes COM que está utilizando.

6

He encontrado esta solución, Dealing with Legacy 32-bit Components in 64-bit Windows ver el artículo:
• Conversión de un tipo de proyecto a partir de procesos de fuera de proceso
• El uso de COM + como anfitrión (este trabajo para mí)
• Uso dllhost como host sustituto

+7

Enlace espejo: http://www.scribd.com/doc/56629579/64-Bit-Insider-Volume-1-Issue-7 – Juhl

Cuestiones relacionadas