2010-05-19 14 views
6

Ein Kunde möchte unsere .NET DLLs von VB6 konsumieren. Sie sind entworfen, um umgekehrte Interop zu unterstützen und alles funktioniert gut ... außer: Es gibt zwei separate VB6-Programme in zwei verschiedenen Verzeichnissen. Es scheint, es notwendig ist, eine von dem zu tun:Wie findet ein COM-Programm eine .NET DLL, die für COM Interop registriert ist?

  1. Kopieren Sie den .NET-DLL in beiden Verzeichnisse oder
  2. Installieren Sie den .NET-DLL im GAC

Diese von der Bemerkung des Kunden ist und auch unterstützt durch die RegAsm documentation:

nach einer Baugruppe mit Regasm.exe registrieren, können Sie es in der global Assembly Cache installieren, so dass es kann von jedem COM-Client aktiviert werden. Wenn die Baugruppe nur ist, die von einer einzigen Anwendung aktiviert wird, können Sie in das Verzeichnis dieser Anwendung einfügen.

Ich bin in diesem Punkt verwirrt.

Erster Punkt der Verwirrung:

Soweit ich verstehe, lokalisiert die COM-Laufzeit die DLL die Prog-ID/Class-ID. Wenn ich in der Registrierung auf den Klassen-ID-Eintrag schaue, sehe ich den vollständigen Pfad zur .NET DLL im CodeBase-Schlüssel. Warum findet ein COM-Programm, das die Prog ID/Class ID verwendet, die .NET DLL nicht mithilfe der CodeBase?

Zweiter Punkt der Verwirrung:

Der GAC ist spezifisch für .NET. Wie ist es bei der Auflösung von COM-Referenzen beteiligt?

Antwort

6

Sie sind korrekt COM verwendet die ProgId, um an die ClassId zu gelangen, um den COM-Server zu laden. Im Fall von .NET COM-DLLs ist der COM-Server tatsächlich MSCOREE, nicht die .NET-DLL (der Wert des Standardschlüssels unter {CLSID}/localserver32). MSCOREE, nicht COM, kann dann die Regeln verwenden, nach denen die .NET-Assembly gesucht werden soll.

An dieser Stelle weiß ich nicht, was .NET wirklich tut - das würde Tests erfordern. Sie können sich selbst beobachten mit FUSLOGVW. Ich kann jedoch erraten, dass es die Assembly lädt, wie es jede andere .NET-Assembly lädt.

Angenommen, es ruft nur Assembly.Load() mit dem ClassName-Wert auf, es folgt der .NET binding rules. Schauen Sie zuerst in den GAC, wenn nicht gefunden wird Sondieren - wenn also eine Codebasis definiert ist, wird es nur dort suchen, sonst wird es basierend auf der Anwendungsbasis (standardmäßig das Verzeichnis der App [aber nicht für ASP.NET ]).

Ich denke, das passt zu dem, was Sie las regasm.

Ihre Frage ist so alt Ich nehme an, es ist OBE gewesen, aber die Regeln würden Sie für die Umsetzung Baugruppen im App-Verzeichnis verwenden, verwenden eine Code-Basis oder im GAC sind gleich mit und w/o com interop. Jede Situation ist anders und ich habe nicht genug .NET getan, um tiefe Einsichten aufzugeben. Ich bevorzuge xcopy installiert, so würde ich mit in das App-Verzeichnis gehen (und registration free COM verwenden), aber es gibt andere Überlegungen, wenn die beiden Vb-Anwendungen die gleiche Version des COM-Objekts verwenden müssen.