Ich habe ein Problem, ich versuche es seit gestern zu lösen, aber kein Glück. Ich habe 32-Bit-Delphi-DLL, die ich in .NET Win-Anwendung importieren möchte. Diese Anwendung muss in jedem CPU-Modus erstellt werden. Natürlich kommt BadImageFormatException, was bedeutet, dass in x64-Anwendung x86 dll nicht geladen werden kann .. Ich habe gegoogelt und eine Lösung gefunden, es hieß, ich müsste Wrapper machen, aber es war nicht klar für mich. kann jemand sagen, wie man dieses Problem löst, gibt es eine mögliche Weise, die ich 32bit Delphi dll im Programm builted jede CPU oder x64-Modus (vielleicht eine andere Lösung) importieren kann.
Eine allgemeine Idee könnte sein, Ihre (nicht verwaltete) 32-Bit-DLL mit einer verwalteten 32-Bit-Wrapper-DLL zu umhüllen und COM sichtbar zu machen. Dies ermöglicht Aufrufe Ihrer Wrapper-DLL über ihre COM-Schnittstelle.
Sie können dann ein COM-Surrogat verwenden, um Ihre COM-DLL als COM-Server außerhalb des Prozesses erscheinen zu lassen. Sehen Sie sich diese SO-Frage für weitere Informationen zu diesem Thema an: Greifen Sie auf x86 COM von x64 zu .NET .
Was Sie tun müssen, ist eine Wrapper-Anwendung schreiben, die die 32-Bit-DLL-Datei in einem 32-Bit-Prozess hostet.
Ihre 64-Bit-Anwendung muss dann mit diesem 32-Bit-Prozess über Netzwerkverbindungen kommunizieren oder indem sie die DLL-Funktionen über ein COM-Objekt oder ähnliches verfügbar macht.
Sie können innerhalb eines 64-Bit-Prozesses keine 32-Bit-DLL ausführen, egal wie sehr Sie es versuchen, also müssen Sie es in einem 32-Bit-Prozess ausführen.
Wenn das Kompilieren Ihrer Anwendung für nur 32 Bit keine Option ist, haben Sie keine andere Wahl als eine Hostanwendung zu erstellen.
Wie ich verstehe, gibt es keine Möglichkeit, eine 32-Bit-DLL aus einer 64-Bit-Anwendung zu verwenden. Das heißt, Sie können Ihre Anwendung nur für X86 kompilieren.
Bei der gefundenen Lösung handelt es sich möglicherweise um die Verwendung einer DLL für 32- und 64-Bit-Versionen in einem "Jede CPU" -kompilierten Projekt, je nachdem, ob die Anwendung in einem 32- oder 64-Bit-Projekt ausgeführt wird Umgebung.
Um dies zu tun, könnten Sie zwei Wrapper-DLLs in C # schreiben, eine für 64-Bit und eine für 32-Bit, und den entsprechenden Wrapper verwenden, abhängig davon, ob Sie auf einem 64-Bit- oder 32-Bit-Betriebssystem arbeiten.
Dies funktioniert jedoch nicht, wenn Sie nur eine 32-Bit-DLL haben. Eine 64-Bit-Anwendung kann keine 32-Bit-DLLs verwenden, und eine 32-Bit-Anwendung kann keine 64-Bit-DLLs verwenden.
Sie müssen also entweder Ihre Anwendung für 32-Bit kompilieren, oder Sie müssen eine 64-Bit-Version Ihrer DLL erstellen.
Eine Lösung, obwohl ein bisschen Chaos eine separate 32-Bit-Anwendung schreiben könnte, mit der Sie aus Ihrer 64-Bit-Anwendung wie einer Konsolenanwendung, an die Sie Befehle senden / senden, sprechen können.
Nicht schön, aber funktioniert möglicherweise, wenn Sie nur gelegentlich einen Anruf dazu benötigen.
Tags und Links .net c# delphi 32bit-64bit