Ich habe eine DLL, die sowohl in 32-Bit- als auch in 64-Bit-Version kommt. Mein .NET WinForm ist für "Any CPU" konfiguriert und mein Chef lässt uns keine separaten Installationen für die verschiedenen Betriebssystemversionen zulassen. Also ich frage mich: wenn ich beide dlls in die installiere, dann gibt es eine Möglichkeit, das WinForm zu bestimmen, ob sein 64bit / 32bit und die richtige dll laden.
Ich habe diesen Artikel zur Bestimmung der Version gefunden. Aber ich bin mir nicht sicher, wie man das richtige injiziert Möglichkeit, das DLLImport-Attribut für die Methoden zu definieren, die ich verwenden möchte. Irgendwelche Ideen?
Sie können die API-Funktion SetDllDirectory nutzen, sie ändert den Suchpfad für nicht verwaltete Assemblys. Speichern Sie Ihre 32-Bit-DLLs im Unterverzeichnis x86 des Anwendungsinstallationsverzeichnisses, den 64-Bit-DLLs im Unterverzeichnis x64.
Führen Sie diesen Code beim Start der App aus, bevor Sie P / Invoke ausführen:
%Vor% Meine Lösung besteht darin, eine einzelne abstrakte Klasse mit einer konkreten Version zu erstellen, die meine 32-Bit-DLL lädt und umhüllt, sowie eine separate Implementierung, die die 64-Bit-DLL lädt und umschließt. Eine einzelne Factory-Methode in der Basisklasse kann verwendet werden, um die entsprechende Implementierung basierend auf IntPtr.Size
zu instanziieren.
Das Schöne an diesem Ansatz ist, dass der Rest Ihres Codes vollständig von der Plattform isoliert ist - er erstellt einfach ein Objekt mit Ihrer Basisklassen-Factory-Methode und arbeitet damit. Es ist auch sehr einfach, mehrere Methoden innerhalb der fraglichen DLLs in einer einheitlichen Weise aufzurufen, und der gesamte "native" Code kann leicht in eine private Implementierung verschoben werden.
... oder Sie können Marshal.GetDelegateForFunctionPointer()
dynamisches P / Invoke .
... oder rufen Sie LoadLibrary()
mit einem vollständig qualifizierten Pfad auf, bevor die CLR versucht, sie für Sie zu laden.