2017-06-28 4 views
0

Ich habe eine WPF-Anwendung, die ich als eine DLL-COM-Komponente erstellen und installieren mit InstallshieldLE, aber ich habe einige Probleme mit einigen abhängigen DLLs, wenn ich meinen COM-Client ausgeführt.COM-Anwendung referenzierte dlls Fehlerbehebung

Meine WPF-DLL verweist auf zwei andere C# -Dlls (A & B), die sich innerhalb der gleichen VS2012-Lösung befinden.

Meine WPF-DLL hat das Register für COM-Interop-Option aktiviert und bietet eine COM-Schnittstelle zum Ausführen der WPF-GUI-Anwendung.

Ich habe ein C-COM-Client-Programm, das die WPF-Anwendung testet. Das Problem, das ich habe, ist, dass ich einige DLLs von dll_A, die ein Grafikpaket eines Drittanbieters sind, in den Ordner des Client-Programms aufnehmen muss, damit die Anwendung erfolgreich ausgeführt wird. Ich muss dll_A oder dll_B nicht in das lokale Client-Verzeichnis aufnehmen.

Es gibt auch andere (C) dlls, die von der COM-Server-DLL referenziert werden und in der Installation enthalten sind, die nicht im Clientverzeichnis vorhanden sein müssen, daher ist dies schwer zu verstehen.

Ich nehme an, dass dies keine WPF-Frage ist, sondern einfach eine Frage zur Installation des com-Servers in Bezug auf andere referenzierte Assemblys.

Ich habe einige Debug-Meldungen in den primären DLLs ausgegeben, die bestätigen, dass die DLLs A & B zusammen mit der Haupt-COM-DLL vom Installationsort ausgeführt werden. Aber ich bekomme Ausnahmen weiter unten, wenn die DLLs von Drittanbietern im lokalen Client-Ordner fehlen.

Kann jemand mir helfen, dieses Problem bitte zu beheben. Ich kann das Client-Programm erfolgreich vom Installationsort ausführen und bin daher sicher, dass alle erforderlichen Assemblys und DLLs vorhanden sind.

Danke.

Antwort

0

Das Problem wurde verursacht, indem eine der referenzierten DLLs mit .NET 4.0 kompiliert wurde, während die anderen mit .NET 4.0 Client kompiliert wurden. Das Neukompilieren mit .NET 4.0-Client hat das Problem behoben.

Das Problem schien bei der Ausführung der Anwendung als eine registrierte com-Komponente auftreten, mit dem Client von einem anderen Speicherort ausgeführt wird. Wenn die fehlerhaften DLLs in das Clientverzeichnis kopiert wurden, läuft alles einwandfrei.

0

Es klingt wie Sie Probleme mit dem DLL-Ladepfad auftreten. Eine Clientanwendung kann Ihre COM-DLL laden, aber Ihre COM-DLL kann keine eigenen Abhängigkeiten (oder Abhängigkeiten von Abhängigkeiten usw.) laden, selbst wenn die Abhängigkeiten im selben Ordner wie die COM-DLL vorhanden sind. Ist das richtig?

Wenn ja, ich glaube, dass dieses Problem mit einem Aufruf der AddDllDirectory Funktion gelöst werden kann - nur Ihre COM DLL aufrufen, bevor Sie eine der Abhängigkeiten laden und RemoveDllDirectory aufrufen, wenn es fertig ist. Weitere Informationen finden Sie im Abschnitt "Hinweise" der Dokumentation für LoadLibrary.

+0

Ja, Sie haben Recht. Ich werde die SetDllDirectory-Funktion untersuchen. Danke für deinen Beitrag. – user5265160

+0

@ user5265160: Es kommt mir vor, dass AddDllDirectory/RemoveDllDirectory besser als SetDllDirectory sind. Antwort aktualisiert –

+0

Danke für die Rückmeldung. Dies ist nützlich zu wissen. Mein Problem war COM/.Net verwandt. Eine der abhängigen DLLs wurde mit .NET 4.0 kompiliert, während die anderen mit .NET 4.0 Client Edition kompiliert wurden. Dies scheint in Ordnung zu sein, wenn sich die abhängigen DLLs im selben Verzeichnis wie der COM-Client befinden, aber nicht, wenn sie sich in der COM-Server-DLL befinden. – user5265160