Externe DLL auf Basis von 64-Bit- oder 32-Bit-Betriebssystemen importieren

8

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?

    
Mike_G 07.04.2010, 15:53
quelle

5 Antworten

6

Können Sie beide importieren und entscheiden, welche über .NET aufgerufen werden sollen?

Zum Beispiel:

%Vor%     
Kieron 07.04.2010, 15:55
quelle
14

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%     
Hans Passant 07.04.2010 16:27
quelle
3

Sie sollten zwei verschiedene private extern -Methoden erstellen und eine interne Methode erstellen, die IntPtr.Size überprüft und die richtige Version aufruft.

    
SLaks 07.04.2010 15:57
quelle
3

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.

    
Reed Copsey 07.04.2010 16:00
quelle
2

... 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.

    
Andras Vass 07.04.2010 16:40
quelle

Tags und Links