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?
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
@pquest, ich denke, ich verstehe so viel, aber nicht ganz sehen, wie es meine Frage beantwortet. Kannst du es ausarbeiten? – adv12
Laden Sie einfach die richtige Version der nativen DLL, bevor Sie eine API aufrufen? So funktionieren die meisten Assemblies, die nativen Interop verwenden. –