2012-03-14 21 views
8

En un proyecto de VC++, intento crear una instancia (a través de COM) de una clase C# contenida dentro de un proyecto C#.Error de clase no registrado para la instanciación del objeto C# a través de COM desde VC++

Datos

  • Tanto el C# y C++ proyectos se compilan utilizando .NET 4.0
  • El C# .dll está siendo registrado utilizando regasm/código base "CSharpProjectName.dll"", y el símbolo del sistema de Windows informes, "Tipos registraron correctamente."
  • en el proyecto de C++, intento crear una instancia de una clase en el proyecto de C#, pero me da un HRESULT de 0x80040154 - clase no registrada

Aquí hay un ejemplo de mi intento de crear una instancia del objeto .NET desde C# .dll. La clase concreta que estoy tratando de crear instancias se llama Empleado, que por el bien de la presentación de mi pregunta, simplemente, implementa la interfaz IPerson:

CSharpProjectName::IPersonPtr pPersonPtr; 
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee); 

¿Por qué recibo un error de "clase no registrada" a pesar de que registró la C# .dll usando "regasm/codebase" y confirma la existencia de la clave en el registro?

Cualquier ayuda sería muy apreciada. ¡Gracias!

+0

Tengo este problema! – TinyRacoon

Respuesta

9

Tuve ese problema en el pasado y fue debido a que ambos procesos no eran de 32 o 64 bits. Si está ejecutando un sistema operativo de 32 bits, puede dejar de leer ahora porque lo que digo no se aplica.

Use regedit para tratar de encontrar sus ProgIds y CLSID en el registro. Si su proyecto C++ es de 32 bits, asegúrese de que sus clases C# se hayan registrado en la sección de 32 bits HKEY_CLASSES_ROOT \ Wow6432Node. Si su proyecto C++ es de 64 bits, asegúrese de que sus clases C# se registraron en la sección de 64 bits HKEY_CLASSES_ROOT.

Si es necesario registrarse a la colmena de 64 bits, es posible que tenga que llamar a la versión de RegAsm.exe en c: \ windows \ microsoft.net \ Framework64 ...

La otra posibilidad para las cosas equivocarse es que puede necesitar ejecutar la versión .NET 4.0 de regasm.exe. Si simplemente escribe "regasm" en la línea de comando, le dará la versión de regasm que está ejecutando. Es posible que deba escribir la ruta completa de la versión .NET 4.0 de Regasm, que se encuentra en c: \ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe.

+1

¡eso fue todo! Estaba usando el v2.0 ... regasm en lugar de v4.0 .... regasm. ¡Muchas gracias! – BigSauce

+0

entonces, si el CLID requerido es 91493441-5A91-11CF-8700-00AA0060263B, y después de intentar buscar no puede encontrarlo entre los registros actuales (regedit)? –

1

¿Has probado la opción /tlb? Pruébalo, y luego

#import "your_tlb_file_lol.tlb" no_namespace 

Creo que la otra opción podría ser activar el ensamblaje y luego volver a registrarlo.

+0

Intenté usar ** # import "CSharpProjectName.tlb" named_guids raw_interfaces_only **. Todavía no funcionó ... – BigSauce

0

tratar de salir de su proyecto en 32 bits, ya que sabe que su proyecto, la creación en cualquiera de las CPU un componente activo que funciona a 32 con un error de registro, por lo que cambiar la acumulación a 32 o preferiblemente a 32.

Usted Demasiado registro dll con regsvr32

Cuestiones relacionadas