2016-04-06 25 views
0

Ich baute eine COM-DLL (Debug x64) auf einem Computer. Ich habe alles eingerichtet und arbeite dort (ich kann es in C: \ Windows \ Micorosft.NET \ Assembly und OLEVIEWER sehen).COM .NET DLL registriert nicht im GAC (REGDB_E_CLASSNOTREG)

Ich nahm die DLL auf eine andere Maschine (zusammen mit seiner .h und .c-Datei von MIDL generiert). Ich registriere die DLL in den GAC, indem ich diese Schritte http://codeingaddiction.blogspot.com/2011/06/how-to-add-strong-name-to-existing-dll_16.html führe - Schlüsselpaare erstellen, MISL generieren, Assembly von MISL mit dem Schlüssel neu aufbauen und dann zum GAC hinzufügen. Es scheint in der GAC zu sein, und ich kann versuchen, es mit gacutil/l MyDllName zu suchen. In meiner Clientanwendung, wenn ich dagegen verlinke, bekomme ich zur Laufzeit beim Aufruf CoCreateInstanceREGDB_E_CLASSNOTREG (HRESULT). Ich kann die DLL weder in C: \ Windows \ Microsoft.NET/Assembly noch in OLEVIEW sehen.

Habe ich irgendwelche Schritte verpasst oder etwas falsch gemacht?

Dank

+1

Sie haben nie erwähnt, Regasm.exe zu verwenden, um die Assembly zu registrieren. Sie können dies auf Ihrem Dev-Computer überspringen, wenn Sie das Kontrollkästchen "Für COM-Interop registrieren" des Projekts verwenden. Natürlich nicht auf dem Computer des Benutzers. Die Verwendung von MIDL ist übrigens seltsam, das klingt nicht koscher. –

+0

Wenn Sie MIDL nicht verwenden (wie das Tutorial unter http://codeingaddiction.blogspot.com/2011/06/how-to-add-strong-name-to-existing-dll_16.html zeigt), was ist der "Koscher"? Art und Weise es zu tun? (Übrigens mein Gedanke mit MIDL war ein bisschen hacky) – Prof

+0

Sie würden normalerweise die # Import-Anweisung in einem C++ - Programm verwenden. –

Antwort

2

Der Grund, warum Sie den Fehler bekommen REGDB_E_CLASSNOTREG ist, weil Ihr .net COM-DLL nicht registriert ist. Jede .net-Assembly muss registriert werden, damit sie als eine Klasse für die Clients verfügbar gemacht wird. Wir müssen regasm.exe verwenden, um die .net-Assembly zu registrieren.

+0

Das hat mich weiter. Ich kann die Assembly immer noch nicht unter Typbibliotheken in OLEVIEW sehen (auf der Maschine, auf der ich die COM-DLL erstellt habe). Auch wenn ich versuche, eine Methode auf der Schnittstelle von meiner Client-Anwendung auf meinem Zielrechner aufzurufen, bekomme ich "... hat keine Adresse, möglicherweise aufgrund von Compiler-Optimierungen." – Prof

+1

Das liegt daran, dass die Typbibliothek der Assembly nicht registriert ist. Sie können es registrieren, indem Sie den Parameter/tlb zu regasm.exe hinzufügen, wie "regasm myTest.dll /tlb:myTest.tlb". Der vorherige Befehl registriert myTest.dll und generiert und registriert die Typbibliothek myTest.tlb. – vamsee