So funktioniert registrierungsfreies COM in verwaltetem / nicht verwaltetem Interop

StackOverflow https://stackoverflow.com/questions/5392152

  •  28-10-2019
  •  | 
  •  

Frage

Ich habe ein nicht verwaltetes C ++ / ATL-COM-Objekt im Prozess (in Unmanaged.dll), das ich aus einer verwalteten C # -DLL (Managed.dll) verwenden möchte. Ich möchte jedoch, dass ich die registrierungsfreie COM verwenden möchte. Ich habe es auf diese Schritte zurückzuführen:

  • Registrieren Sie das COM-Objekt auf dem Entwicklungscomputer. Der In-Process-Server muss über eine ordnungsgemäß registrierte Typbibliothek verfügen.
  • Fügen Sie im C # -Projekt einen Verweis auf das COM-Objekt hinzu und setzen Sie die Referenzeigenschaften auf Isolated= True.

    Dies erzeugt Unmanaged.dll, Managed.dll und Native.Managed.manifest. Beim Öffnen des Manifests ist ziemlich klar, wie das System es verwendet, um das COM-Objekt registrierungsfrei zu laden.

    Hier ist das Problem. Ich habe eine verwaltete EXE-Datei (Managed.exe), die Managed.dll dynamisch lädt, um auf öffentliche Typen zuzugreifen. Was ich unter "dynamisch" verstehe, ist, dass Assembly.LoadFrom ("Managed.dll") verwendet wird. Wenn der Code in Managed.dll versucht, das COM-Objekt zu erstellen, wird die Ausnahme "Klasse nicht registriert" angezeigt. Es scheint, dass der Aktivierungskontext beim Laden von Managed.dll nicht korrekt eingerichtet wird.

    Gibt es eine Möglichkeit, die registrierungsfreie COM in diesem Szenario zum Laufen zu bringen?

War es hilfreich?

Lösung

Zwei Tage ohne Antwort, also hier ist, was ich mir in dieser Zeit ausgedacht habe ...

Es sieht tatsächlich so aus, als würde der Aktivierungskontext beim Start des Prozesses vom Betriebssystem basierend auf dem Manifest eingerichtet, das der Haupt-EXE zugeordnet ist. Das bedeutet, dass sich alle registrierungsfreien COM-bezogenen Elemente zum Zeitpunkt des Starts des Prozesses im Main.exe.manifest befinden müssen. Dies unterbricht die Isolation zwischen EXE und DLLs. Wenn eine DLL für die Erstellung von COM-Objekten verantwortlich ist, müssen Sie nicht erwarten, dass das EXE-Manifest die reg-freien COM-Informationen enthält. Möglicherweise haben Sie erwartet, dass das mit der DLL verknüpfte Manifest zum Zeitpunkt des Ladens der DLL in den Prozessaktivierungskontext eingefügt wird, dies ist jedoch nicht der Fall.

Um dies zu umgehen, muss die DLL vor dem Erstellen des COM-Objekts einen neuen Aktivierungskontext konfigurieren. Um die Sache noch schlimmer zu machen, gibt es derzeit (ab .NET 4.0) keine verwaltete Möglichkeit, dies zu tun. Die DLL muss also die folgenden Win32-Funktionen aufrufen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top