2012-03-14 10 views
8

In un progetto VC++, sto cercando di creare un'istanza (tramite COM) di una classe C# contenuta in un progetto C#.Errore di classe non registrato per l'istanziazione dell'oggetto C# tramite COM da VC++

fatti

  • Sia il C# e C++ progetti vengono compilati usando .NET 4.0
  • Il C# DLL viene registrata utilizzando regasm/codebase "CSharpProjectName.dll"", e le finestre prompt dei comandi rapporti, "Tipi registrato con successo."
  • nel C++ del progetto, tento di creare un'istanza di una classe nel progetto C#, ma ottengo un HRESULT di 0x80040154 - classe non registrata

Ecco un esempio del mio tentativo di creare un'istanza dell'oggetto .NET da C# .dll. La classe concreta che sto cercando di istanziare si chiama dipendenti, che per il bene di presentare la mia domanda semplice, implementa l'interfaccia IPerson:

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

Perché mi appare un errore di "classe non registrata" anche se ho registrato il C# .dll che usa "regasm/codebase" e conferma l'esistenza della chiave nel registro?

Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

+0

Ho questo problema esatto! – TinyRacoon

risposta

9

Ho avuto questo problema in passato ed era dovuto a entrambi i processi che non erano a 32 o 64 bit. Se stai utilizzando un sistema operativo a 32 bit, puoi smettere di leggere ora perché quello che dico non si applica.

Utilizzare regedit per cercare e trovare ProgID e CLSID nel Registro di sistema. Se il progetto C++ è a 32 bit, assicurarsi che le classi C# siano state registrate nell'hive a 32 bit - HKEY_CLASSES_ROOT \ Wow6432Node. Se il tuo progetto C++ è a 64 bit, assicurati che le tue classi C# siano state registrate nell'hive a 64 bit - HKEY_CLASSES_ROOT.

Se è necessario registrarsi per l'alveare a 64 bit, potrebbe essere necessario chiamare la versione di RegAsm.exe sotto c: \ windows \ microsoft.net \ Framework64 ...

L'altra possibilità per le cose sbagliare è che potrebbe essere necessario eseguire la versione .NET 4.0 di regasm.exe. Se digiti "regasm" nella riga di comando, ti darà la versione di regasm che stai utilizzando. Potrebbe essere necessario digitare il percorso completo della versione 4.0 di .NET di regasm, che si trova in c: \ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe.

+1

è stato! Stavo usando il v2.0 ... regasm piuttosto che v4.0 .... regasm. Molte grazie! – BigSauce

+0

quindi, se il CLID richiesto è 91493441-5A91-11CF-8700-00AA0060263B, e dopo aver provato la ricerca non è possibile trovarlo tra i registri attuali (regedit)? –

1

Hai provato l'opzione /tlb? Prova che, e quindi

#import "your_tlb_file_lol.tlb" no_namespace 

penso che l'altra opzione potrebbe essere quella di GAC l'assemblaggio e poi Regasm esso.

+0

Ho provato a usare ** # import "CSharpProjectName.tlb" named_guids raw_interfaces_only **. Ancora non ha funzionato ... – BigSauce

0

cercare di lasciare il progetto in 32 bit, perché sai che il tuo progetto, creando in qualsiasi CPU un componente attivo che funziona a 32 con un errore di Registro di sistema, in modo da cambiare la build a 32 o, preferibilmente a 32.

È Registra anche la tua dll con regsvr32

Problemi correlati