Ich habe eine vorhandene App, die P/ruft auf eine DLL im selben Verzeichnis wie die App selbst auf.P/Aufrufen dynamischer DLL-Suchpfad
Jetzt (aufgrund der Tatsache, dass Canon eine der Crappiest APIs produziert) muss ich zwei Versionen dieser API unterstützen und zur Laufzeit bestimmen, welche ich verwenden soll (alt oder neu). Da die DLLs den gleichen Namen haben (der erste lädt andere DLLs mit gleichen Namen, so dass nur die Umbenennung der ersten nicht hilft), muss ich sie in verschiedenen Verzeichnissen behalten.
Daher meine Frage: Welche Optionen habe ich zu steuern, welches Verzeichnis die DLL in einer DllImport-Deklaration verwendet verwendet?
Ich denke, ich versuche, eine dieser beiden Ideen beginnen können:
1) Verwenden Sie „SetDllDirectory“ meine gewünschte Verzeichnis zu setzen, bevor die erste P/Invoke tun und es dann anschließend zurückgesetzt.
2) Laden Sie die gewünschte DLL manuell mit "LoadLibraryEx" und hoffe, dass das den Trick macht.
Aber gibt es noch mehr ". NET: ish way" zuerst ausprobieren?
UPDATE: Ich realisiere, dass ich alle Zugriffe auf die DLLs in zwei separaten .Net Assemblies stopfen kann und dann jedes einzelne davon in einem separaten Verzeichnis mit den entsprechenden API-Dateien ablegen kann. Dann kann ich die richtige .Net-Assembly dynamisch laden und das Laden der richtigen DLL wird automatisch geschehen. Irgendein Grund, der nicht funktionieren sollte?
Ich kann mir eins vorstellen: Wie würde ich über Debugging dieses Zeug gehen? Es ist möglich, Visual Studio mitzuteilen, dass eine Assembly (in meiner Lösung enthalten) in einem Unterverzeichnis platziert und von dort debuggt werden soll?
Für den Moment gebe ich Ihnen ein +1 für Ihr Beileid, das habe ich wirklich gebraucht, nachdem ich in den letzten sechs Jahren mehrmals mit ihren APIs konfrontiert worden war ... –