2011-07-28 17 views
9

Tengo un objeto COM de terceros (32 bit) que necesito llamar desde mi aplicación C# (64 bit). Sé que tengo que ejecutar el objeto COM en un proceso separado. Este objeto COM tiene muchas clases implementadas en él, así que estoy tratando de evitar escribir mi propia envoltura remota que expone todos los métodos. COM + parece ser la solución más directa. Abrí el menú de Servicios de componentes, creé una nueva aplicación COM +, agregué mi objeto COM como componente a esta aplicación. Todo parecía importar maravillosamente.Llamando COM de 32 bits desde C# ejecutándose en modo de 64 bits

En mi aplicación C#, agregué el objeto COM original como referencia (que genera automáticamente la biblioteca de tipos). Utilizando la referencia de biblioteca de tipo, puedo crear objetos a partir del componente COM + (los veo comenzar a girar en la ventana de Servicios de componentes), pero cuando intento acceder a los métodos del objeto, aparece un error al decir que la interfaz no está registrado

¿Alguien tiene una pista? Volví y ejecuté regsvr32 en el objeto COM, pero no creo que fuera necesario, y no ayudó. ¿Mi uso en C# es correcto? La autocompleta VS2008 no tuvo problemas para ver esos métodos.

La excepción exacta es: "Interfaz no registrada (Excepción de HRESULT: 0x80040155)"

poco claro sobre exactamente cuáles son las funciones y los permisos están a punto de los Servicios de componentes, he intentado establecer la identidad de objeto COM + a ejecutarse bajo la cuenta del sistema, como servicio local y como usuario interactivo. He agregado a Todos como usuario en las Roles. Todo se ejecuta localmente, por lo que no debería haber un problema con privilegios de archivos ni nada de eso.

También quiero reiterar que este objeto COM contiene muchas clases. Instalé exitosamente un objeto de clase en mi cliente y establecí algunos valores de propiedad. También ejecuté con éxito otro objeto de clase, pero recibí esta excepción al intentar llamar a un método de este segundo objeto .... así que no piensa hay un problema con el registro en el que está registrado mi objeto COM.

+0

COM + es extremadamente dependiente de derechos/permisos, etc. quizás esto que está sucediendo ... – Yahia

+4

Windows efectivamente tiene dos registros diferentes, uno para 32 y uno para 64 bit. Creo que la interfaz está registrada en una y luego en otra. – GSerg

+0

GSerg es correcto. Si la aplicación que lo registra es de 32 bits, se ejecuta en un sistema de 64 bits, todas las entradas de registro terminan en el nodo duplicado WOW6432 en lugar de donde normalmente irían. –

Respuesta

2

Tuvimos una situación similar, trabajando con un dll COM de VFP.

Todo depende de los derechos y permisos, como dice Yahia. lo tenemos trabajo por hacer esto:

  • Instalar VFP 9 oledb conductores (dunno lo que tiene por lo que probablemente no es obligatorio).
  • otorgarle al Servicio de red IIS_IUSR control total en la carpeta COM (se requiere para que el archivo DLL pueda hacer algunos inicios de sesión en su propia carpeta, cuando se le llame desde el sitio web).
  • ejecutar regsvr32.exe "c: \ xxx \ yourfile.dll" -> esto debería ser un éxito!
  • Crear aplicación COM +, y añadir el archivo DLL como parte
  • Establecer la aplicación COM + credenciales en un wigh usuario derechos suficientes

y tuvimos que hacer algunos ajustes más sobre los derechos en el grupo de aplicaciones/IIS, pero eso no es necesario para ti, supongo.

De todas formas, sólo asegúrese de que tiene suficiente registro, asegúrese de que la DLL está registrada y, después de eso todo es cuestión de derechos derechos derechos ..

Buena suerte con eso!

1

Perdón por utilizar la "Respuesta" para responder a los comentarios, pero parece ser mi única avenida.

Todo el propósito de pasar a un sistema operativo de 64 bits fue obtener el espacio de memoria extra direccionable, por lo que ejecutar toda la aplicación en modo de 32 bits no es una opción.

Podría ser relevante para el problema que después de crear tres objetos de clase, pude establecer propiedades en una, llamar a un método sin argumentos en la segunda, pero estaba llamando a un método en la tercera, lo que llevó los otros dos objetos como argumentos que arrojaron la excepción.

Cuestiones relacionadas