Wir haben eine Anwendung, die von mehreren Gruppen von Drittanbieter-DLLs abhängt. Leider hat keiner der Autoren dieser Drittanbieter-DLLs sie sehr einheitlich benannt, so dass es schwer zu erkennen ist, welche DLL zu welcher Gruppe gehört.
Um dies zu bewerkstelligen, möchten wir Gruppen von DLLs von Drittanbietern in einem Ordner in unserem Anwendungsordner ablegen und nicht direkt neben der Anwendung, etwa so.
--> Application Folder
--> Application.exe
--> MyDLL1.dll
--> MyDLL2.dll
--> Third Party 1 DLL folder
--> Third Party 1 DLL 1.dll
--> Third Party 1 DLL 2.dll
--> Third Party 1 DLL 3.dll
--> Third Party 2 DLL folder
--> Third Party 2 DLL 1.dll
--> Third Party 2 DLL 2.dll
--> Third Party 2 DLL 3.dll
Meine Frage ist, wie man den dynamischen Linker dazu bringt, sie zu finden und zu laden?
Wir könnten dies manuell mit LoadLibrary() und GetProcAddress() tun, aber das ist sehr mühsam. Es sieht so aus, als könnten wir dies mit Manifesten und "Sondierung" tun, aber dies scheint nur Windows 7 zu sein (wir müssen auf XP und höher arbeiten).
Update
Wir haben dafür schließlich Manifeste verwendet (danke @Chris) - es gab noch ein paar andere Hürden, die wir nehmen mussten, falls jemand nach einer Lösung sucht!
Erstens besteht unsere "Baugruppe" aus mehreren DLLs, von denen wir eine mit einer anderen verknüpfen, die wiederum auf andere verweist. Für alle diese DLLs muss die Assembly-Abhängigkeit zu ihren Manifesten hinzugefügt werden (Sie können mt.exe verwenden, um dies zu tun, ohne Zugriff auf den Quellcode dieser DLLs zu haben).
Zweitens muss die Assembly neben der DLL und nicht neben der EXE installiert werden - unsere DLL war eigentlich ein Plugin, das sich bereits in einem Unterordner der Anwendung befand.
Hier ist unser endgültiges Layout:
--> Application Folder
--> Application.exe
--> Plugins folder
--> MyDLL1.dll
--> Third Party 1
--> Third Party 1.manifest
--> A.dll
--> B.dll
--> C.dll
Wenn MyDLL1.dll ein Plugin ist, das auf A.dll verweist, und A.dll sowohl auf B.dll als auch auf C.dll verweist, dann:
- "Third Party 1.manifest" muss alle A.dll, B.dll und C.dll als Assembly enthalten
- "MyDLL1.dll" braucht einen Abhängigkeitseintrag in seinem Manifest zu "Third Party 1", sonst findet der Dynamic Linker A.dll nicht
- A.dll benötigt einen Abhängigkeitseintrag in ihrem Manifest zu "Third Party 1", sonst findet der dynamische Linker B.dll und C.dll nicht
- Der Ordner "Third Party 1" muss sich neben "MyDLL1.dll" befinden, nicht neben "Application.exe".
Für mich ist (3) ein wenig irritierend. Man sollte meinen, dass der Linker in der Assembly nach abhängigen DLLs suchen würde.