Registrierung kostenlos COM, ohne die DLL in das gleiche Verzeichnis wie die ausführbare Datei zu kopieren

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

  •  29-10-2019
  •  | 
  •  

Frage

Wie kann ich ein anmeldefreies COM-Objekt verbrauchen, ohne die DLL in dasselbe Verzeichnis wie die ausführbare Datei zu kopieren? Ist das möglich?

Ich möchte ein komplettes Arbeitsbeispiel oder einen detaillierten Schritt-für-Schritt-Anleitung für mein genaues Szenario.

Beispielsweise habe ich folgende Komponenten:
Cppptestrunner.exe - vc ++ console Antrag
Cpptests.dll - vc ++ mfc dll
CscomServer.dll - c # com sichtbare dll

Ich möchte den EXE oder das Verzeichnis nicht ändern, wie das Hinzufügen eines externen Manifests.
Cpptests.dll ist in einem anderen Verzeichnis als der EXE.
Es ist in Ordnung, wenn cscomServer.dll sich im selben Verzeichnis wie cpptests.dll befindet.

cppptestrunner.exe ruft Loadlibrary auf cpptests.dll an, was gut funktioniert.

Nach dem Einbetten der Manifests und mithilfe der Windows-Aktivierungskontext-APIs konnte ich CscomServer.dll in das EXE-Verzeichnis kopieren, um sicherzustellen, dass cpptests.dll eine Instanz von cscomServer.dll ohne Probleme erstellen kann, aber wieder versuche ich zu Vermeiden Sie diesen Schritt.

derzeit mit cscomServer.dll in demselben Verzeichnis wie cpptests.dll, und ohne cscomServer.dll im EXE-Verzeichnis erhalte ich den folgenden Fehler, wenn ich CoCreateinstance anrufe:
ERROR= 0x80070002 Das System kann die angegebene Datei nicht finden.

Ich habe SysInternals-Prozessmonitor verwendet, um die Pfade zu verfolgen, die cppptestrunner.exe sehen, usw.
Ich bemerke, dass ich je nach den Dingen, die ich zu tun habe, manchmal versucht, Cpptestrunner.exe, cscomServer.dll.config in demselben Verzeichnis wie cpptests.dll zu lesen, aber egal, was ich versuche, dort einzugehen, ich konnte nicht bekommen den Fehler vorbei.
Je nach anderer Dinge versuche ich zu tun, cpptestrunner.exe versucht, cscomServer.dll in demselben Verzeichnis wie cpptests.dll zu lesen, aber aus irgendeinem Grund bekomme ich immer noch den gleichen Fehler.

Jeder, der den Code mit diesem examen Szenario kennt?

Wie Sie wahrscheinlich sagen können, ist dies Teil einiger Einheiten \ Integrationstests.

Als einfache Problemumgehung kopiere ich derzeit cppptestrunner.exe in das selbe Verzeichnis wie cpptests.dll und läuft es von dort aus, möchte aber diesen Schritt vermeiden.

danke.

War es hilfreich?

Lösung

.NET sucht zuerst im GAC und dann im Ordner der ausführbaren Datei nach verwaltetem, registrierungsfreiem COM.Es verwendet den Aktivierungskontext, um Aktivierungsmetadaten zu lesen, aber nicht, um den Speicherort der Dateien selbst zu bestimmen.

Andere Tipps

Sie können die DLL in einem Unterordner speichern, beispielsweise DLLFolder \ YourDll.dll , und in die Manifestdatei Ihrer DLL den Dateinamen wie schreiben

<file name = "DLLFolder\YourDll.dll">

Sie müssen jedoch die Manifestdatei (der DLL) an dem Speicherort aufbewahren, an dem die EXE-Datei gespeichert ist.

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