Ich habe einige Verwirrung in Bezug auf die Erstellungsoptionen der .NET-Plattform in Visual Studio 2008.
Was ist das Kompilierungsziel "Beliebige CPU" und welche Art von Dateien werden generiert? Ich habe die ausführbare Ausgabedatei dieses Builds "Any CPU" untersucht und festgestellt, dass es sich um die ausführbaren x86-Dateien handelt (wer würde das nicht kommen sehen!). Gibt es also einen Unterschied zwischen dem Targeting der ausführbaren Datei auf x86 und "Any CPU"?
Eine andere Sache, die mir aufgefallen ist, ist, dass verwaltete C ++ - Projekte diese Plattform nicht als Option haben. Warum ist das so? Bedeutet das, dass mein Verdacht, dass "Any CPU" -Programmdateien einfache 32-Bit-Dateien sind, richtig ist?
.net
visual-studio-2008
build
64-bit
Galets
quelle
quelle
Any CPU
und Sie runnning auf einem 64 - Bit - OS, verlieren Sie die Möglichkeit , zu bearbeiten und weiter während des Debuggens. (Sie debuggen effektiv einen 64-Bit-Prozess). Sie können das Startup-Projekt als Ziel festlegenx86
, um dies beim Debuggen zu umgehen. (Die Versammlungen, auf die aus dem Startprojekt verwiesen wird, zielen möglicherweise weiterhin auf das Ziel abAny CPU
.x86
gestoßen, weil eine Bibliothek von einerAnyCPU
Anwendung verwendet wurde, die ich einstellen musstePrefer 32-bit
, um einen Ladefehler zu vermeiden.Antworten:
Eine AnyCPU- Assembly wird beim Laden in einen 64-Bit-Prozess zu 64-Bit-Code und beim Laden in einen 32-Bit-Prozess zu 32-Bit-Code JIT.
Wenn Sie die CPU einschränken, würden Sie sagen: Es wird etwas von der Assembly verwendet (etwas, das wahrscheinlich nicht verwaltet wird), das 32 Bit oder 64 Bit erfordert.
quelle
Ich denke, die meisten wichtigen Dinge wurden gesagt, aber ich dachte nur, ich würde eines hinzufügen: Wenn Sie als Beliebige CPU kompilieren und auf einer x64-Plattform laufen, können Sie keine 32-Bit-DLL-Dateien laden. weil Ihre Anwendung nicht in WoW64 gestartet wurde, diese DLL-Dateien jedoch dort ausgeführt werden müssen.
Wenn Sie als x86 kompilieren, führt das x64-System Ihre Anwendung in WoW64 aus und Sie können 32-Bit-DLL-Dateien laden.
Ich denke, Sie sollten "Beliebige CPU" wählen, wenn Ihre Abhängigkeiten in beiden Umgebungen ausgeführt werden können, aber x86 wählen, wenn Sie 32-Bit-Abhängigkeiten haben. Dieser Artikel von Microsoft erklärt dies ein wenig:
/ CLRIMAGETYPE (Typ des CLR-Bildes angeben)
Im Übrigen stimmt diese andere Microsoft-Dokumentation zu, dass x86 normalerweise eine portablere Wahl ist:
quelle
Hier ist eine kurze Übersicht , in der die verschiedenen Build-Ziele erläutert werden.
Wenn Sie aus eigener Erfahrung ein Projekt erstellen möchten, das sowohl auf x86- als auch auf x64-Plattformen ausgeführt werden kann und Sie keine spezifischen x64-Optimierungen haben, würde ich den Build so ändern, dass er speziell "x86" lautet.
Der Grund dafür ist manchmal, dass Sie einige DLL-Dateien erhalten, die kollidieren, oder Code, der WoW in der x64-Umgebung zum Absturz bringt . Durch die spezifische Angabe von x86 behandelt das x64-Betriebssystem die Anwendung als reine x86-Anwendung und stellt sicher, dass alles reibungslos funktioniert.
quelle
Lesen Sie den Artikel Erläuterung des Visual Studio .NET-Plattformziels .
Es wurde berichtet, dass der obige Link fehlerhaft ist. Hier ist ein weiterer Artikel mit einer ähnlichen Erklärung: Was AnyCPU ab .NET 4.5 und Visual Studio 11 wirklich bedeutet
quelle
Gutschrift für das Buch "CLR via C #" , siehe dies:
quelle
"Beliebige CPU" bedeutet, dass .NET Framework beim Starten des Programms anhand der Betriebssystem-Bits ermittelt, ob Ihr Programm in 32-Bit- oder 64-Bit-Schritten ausgeführt werden soll.
Es gibt einen Unterschied zwischen x86 und einer beliebigen CPU : Auf einem x64-System wird Ihre für X86 kompilierte ausführbare Datei als ausführbare 32-Bit-Datei ausgeführt.
Wenn Sie den Verdacht haben, rufen Sie einfach die Visual Studio 2008-Befehlszeile auf und führen Sie Folgendes aus.
Es wird Ihnen die Bitterkeit Ihres Programms und vieles mehr zeigen.
quelle
Jede CPU bedeutet, dass sie auf jeder Plattform funktioniert. Dies liegt daran, dass verwalteter Code Java ähnelt. Stellen Sie sich vor, es wird zu einem Bytecode kompiliert, der zur Laufzeit von .NET Framework interpretiert wird.
C ++ verfügt nicht über diese Option, da sie zu plattformspezifischem Maschinencode kompiliert wurde.
quelle
Ich empfehle diesen Beitrag zu lesen .
Bei Verwendung von AnyCPU ist die Semantik wie folgt:
quelle
So habe ich es in Visual Studio 2017 gemacht:
quelle