2016-01-25 14 views
5

Ich habe viele Fragen und Antworten gelesen, die darauf hinweisen, dass ich kein AnyCPU Plattformziel verwenden kann, wenn ich mein C# -Projekt mit nativen Bibliotheken verknüpfen möchte, aber getrennte 32- und 64-Bit-Builds erstellen muss, die jeweils mit der nativen DLL verknüpft sind der angemessenen Bissigkeit.Wie verweisen .NET Framework-Klassen auf native Windows-DLLs, ohne bititätsspezifisch zu werden?

Das lässt mich fragen, wie die .NET Framework-Assemblies für AnyCPU selbst erstellt werden oder zumindest zu sein scheinen. Das heißt, wenn ich einen Verweis auf meine GUI-Anwendung hinzufüge, warum muss ich nicht die 32-Bit- oder 64-Bit-Version von System.Windows.Forms auswählen? Ich dachte, dies könnte nur eine Visual Studio-Magie sein, die auf das entsprechende GAC-Unterverzeichnis (GAC_32 oder GAC_64) auflösen würde, aber ich suchte nach System.Windows.Forms.dll im GAC und fand es in:

C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ System.Windows.Forms \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Windows.Forms.dll

Beachten Sie die "GAC_MSIL". Wie schafft es diese DLL also, eine native 32-Bit-API zu umbrechen und dennoch in einer 64-Bit-Anwendung verknüpfbar zu bleiben? Und warum kann ich eine ähnliche Strategie nicht verwenden, um eine einzelne C# -DLL zu erstellen, die mit einer nativen 32-Bit-Bibliothek verknüpft ist, aber im 64-Bit-Modus lauffähig bleibt?

+0

zu laden. Das liegt daran, dass .NET-Assemblies nicht auf Prozessoranweisungen kompiliert werden. Sie kompilieren zu einer [Zwischensprache] (https://en.wikipedia.org/wiki/Common_Intermediate_Language), die dann durch das .NET-Framework läuft und zur Laufzeit in Prozessoranweisungen übersetzt wird. – pquest

+0

@pquest, ich denke, ich verstehe so viel, aber nicht ganz sehen, wie es meine Frage beantwortet. Kannst du es ausarbeiten? – adv12

+0

Laden Sie einfach die richtige Version der nativen DLL, bevor Sie eine API aufrufen? So funktionieren die meisten Assemblies, die nativen Interop verwenden. –

Antwort

0

Option 1: In GAC können Sie zwei Versionen von Assembly One 32 und One 64 Bit mit genau denselben Namen registrieren. Oracle DB Driver für .NET verwendet diese Strategie.

Option 2: Mit Ihrer Assembly, die AnyCPU sein wird, stellen Sie zwei Versionen der nativen DLL bereit und wählen zur Laufzeit die richtige DLL (SQLite funktioniert so). Wie sich herausstellt, ist .NET Framework intelligent genug, um die korrekte Version der nativen DLL über P/Invoke (Using a 32bit or 64bit dll in C# DllImport)