2008-09-29 4 views
11

Ich habe eine C# -Assembly, die ich über COM aus einer Delphi (Win32 native) -Anwendung aufrufen.Warum registriert regasm.exe meine C# -Assembly mit der falschen GUID?

Dies funktioniert auf allen Maschinen, auf denen ich es getestet habe, außer einem.

Das Problem ist, dass die Delphi-Anwendung beim Versuch, das COM-Objekt zu erstellen, "Klasse nicht registriert" erhält.

Nun, wenn ich in der Registrierung unter HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID suchen, ist die GUID, die dort aufgeführt ist nicht das gleiche wie die Assembly Guid in AssemblyInfo.cs. Es sollte das gleiche sein - es ist das gleiche auf allen anderen Computern, auf denen es installiert ist.

Ich habe versucht regasm /unregister delphitocsharp.dll, und das entfernt den Registrierungsschlüssel. Dann, wenn ich regasm delphitocsharp.dll mache, gibt der Registrierungsschlüssel zurück, aber die GUID ist die gleiche wie zuvor (dh falsch), und Delphi bekommt immer noch "Klasse nicht registriert".

DelphiToCSharp.dll auf der Arbeitsmaschine ist mit der Version auf der nicht funktionierenden Maschine identisch (verifiziert mit MD5).

Alles was ich denken kann ist, dass eine alte Version der DLL zuvor registriert wurde, und es gibt immer noch einen Rest dieser Datei, die regasm verwirrt macht.

Wie kann ich dieses Problem beheben oder zumindest weiter diagnostizieren?

Antwort

12

Die GUID in AssemblyInfo wird die "Type-Library" GUID und in der Regel nicht das, was Sie suchen. Ich gehe davon aus, dass Sie versuchen, auf eine Klasse zuzugreifen, und Sie müssen ein Guid-Attribut und ComVisible für die Klasse definieren. Zum Beispiel:

[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]  
public class MyCOMRegisteredClass 

Wenn Sie nicht, dann ist die Klasse entweder a) nicht registriert werden, oder b) wenn Sie ComVisible (true) auf Baugruppenebene definiert haben, wird eine GUID zugewiesen werden dass .NET für Sie bereit ist.

1

Vielleicht haben Sie irgendwo eine alte Version der Baugruppe? Vielleicht in der GAC? Wahrscheinlich nimmt Regasm das auf und benutzt es.

+0

Es kann nicht im GAC sein, weil meine Assembly nicht signiert ist. Guter Punkt, ich werde nach anderen Kopien der Datei suchen. – Blorgbeard

+0

.Net Assembly lädt nicht die DLL in so viele Verzeichnisse wie win32, so dass dies kaum der Fall sein kann. –

1

Wahrscheinlich haben Sie eine Kopie der gleichen (alte Version) dll irgendwo auf Ihrem System, suchen Sie Datenträger nach Kopien der gleichen Datei und entfernen Sie sie manuell, bevor Sie die neue Kopie registrieren.