558 Stimmen

Wie behebe ich den Visual Studio-Kompilierungsfehler "Abweichung zwischen Prozessorarchitekturen"?

Ich bin neu in der Projektkonfiguration in Visual Studio 2010, aber ich habe einiges recherchiert und kann dieses Problem immer noch nicht ganz lösen. Ich habe eine Visual Studio-Lösung mit einem C++-DLL, das das C#-DLL referenziert. Das C#-DLL referenziert einige andere DLLs, einige innerhalb meines Projekts und einige externe. Wenn ich versuche, das C++-DLL zu kompilieren, erhalte ich diese Warnung:

Warnung MSB3270: Es gab einen Unterschied in der Prozessorarchitektur des zu erstellenden Projekts "MSIL" und der Prozessorarchitektur des Verweises "[internes C#-DLL]", "x86".

Es sagt mir, dass ich zum Konfigurations-Manager gehen soll, um meine Architekturen auszurichten. Das C#-DLL ist mit der Plattformziel x86 eingestellt. Wenn ich versuche, dies auf etwas anderes zu ändern, wie zum Beispiel Any CPU, beschwert es sich, weil eine der externen DLLs, von der es abhängt, das Plattformziel x86 hat.

Wenn ich mir den Konfigurations-Manager anschaue, zeigt er die Plattform für mein C#-DLL als x86 und für mein C++-Projekt als Win32 an. Das scheint die richtige Konfiguration zu sein; sicherlich möchte ich nicht, dass das Projekt für mein C++-Projekt auf x64 gesetzt wird, was die einzige andere Option ist.

Was mache ich hier falsch?

0 Stimmen

Was ist die Beschwerde, speziell, wenn Sie es auf Any CPU ändern?

2 Stimmen

Ich habe nicht genug Informationen, um eine fundierte Empfehlung abzugeben, aber klicken Sie mit der rechten Maustaste auf Ihre Lösung -> Projekt Build Reihenfolge und stellen Sie sicher, dass Ihr C#-Projekt vor dem C++-Projekt erstellt wird. Wenn nicht, gehen Sie zum Register "Abhängigkeiten" und teilen Sie VS mit, dass das C++-Projekt vom C#-Projekt abhängt.

7 Stimmen

Visual Studio ist wieder Mist darin. Die Plattform oben auf meinem Bildschirm sagt x64, aber die Warnung besagt, dass das Projekt, das erstellt wird, "MSIL" ist. Also sagt Visual Studio mir, dass es eine Diskrepanz zwischen Äpfeln und Orangen gibt, wenn ich keine Äpfel benutze. Können wir es in Visual Stupido umbenennen?

7voto

JBourne Punkte 150

Ich hatte heute dieses Problem und das Ansehen der Gebäudekonfigurationen in Visual Studio half nicht, weil es für sowohl das Projekt, das nicht erstellt wurde, als auch das referenzierte Projekt auf Any CPU zeigte.

Dann schaute ich mir die csproj des referenzierten Projekts an und fand dies:

pdbonly
true
bin\Release\
TRACE
prompt
4
x64

Irgendwie wurde dieser PlatformTarget inmitten einer Konfigurationsänderung hinzugefügt und das IDE schien es nicht zu sehen.

Das Entfernen dieser Zeile aus dem referenzierten Projekt löste mein Problem.

0 Stimmen

Es hat mich einen ganzen Tag gekostet, dies herauszufinden. Vielen Dank! :)

5voto

Verwenden Sie https://learn.microsoft.com/de-de/visualstudio/msbuild/customize-your-build#directorybuildprops-example:

  • Fügen Sie eine Directory.Build.props-Datei zum Lösungsordner hinzu
  • Fügen Sie dies ein:

    None

3voto

Dave Cousineau Punkte 10963

Zusätzlich zu David Sacks Antwort müssen Sie möglicherweise auch zum Register Build der Projekteigenschaften und setzen Sie Plattformziel auf x86 für das Projekt, das Ihnen diese Warnungen gibt. Obwohl Sie erwarten könnten, dass es so ist, scheint diese Einstellung nicht perfekt mit der Einstellung im Konfigurations-Manager synchronisiert zu sein.

3voto

David W Punkte 9972

Wenn Ihre C# DLL x86-basierte Abhängigkeiten hat, muss Ihre DLL selbst auch x86 sein. Ich sehe da wirklich keine Möglichkeit. VS beschwert sich darüber, dass man es nicht auf (zum Beispiel) x64 ändern kann, da eine 64-Bit ausführbare Datei keine 32-Bit-Bibliotheken laden kann.

Ich bin ein wenig verwirrt über die Konfiguration des C++-Projekts. Die Warnmeldung, die für den Build bereitgestellt wurde, deutet darauf hin, dass es für AnyCPU ausgelegt war, da angegeben wurde, dass die Plattform, auf die es abzielte, [MSIL] war, aber Sie haben angegeben, dass die Konfiguration des Projekts tatsächlich Win32 war. Eine native Win32-Anwendung sollte nichts mit MSIL zu tun haben - obwohl sie wahrscheinlich CLR-Unterstützung aktiviert haben müsste, wenn sie mit einer C#-Bibliothek interagiert. Also denke ich, dass es ein paar Informationslücken gibt.

Könnte ich höflich darum bitten, dass Sie die genaue Konfiguration der Projekte überprüfen und etwas mehr Details darüber veröffentlichen, wie sie miteinander verknüpft sind? Würde gerne weiterhelfen, wenn möglich.

2voto

Jonathan DeCarlo Punkte 2768

Für C#-Projekte bedeutet das Ziel x86 genau das, was es klingt. Es besagt, dass dieses Assembly nur x86-Architekturen unterstützt. Gleiches gilt für x64. Jede CPU hingegen besagt, dass es mir egal ist, welche Architektur, ich unterstütze beide. Also, die nächsten 2 Fragen lauten (1) Was ist die Konfiguration der ausführbaren Datei, die diese DLLs verwendet? und (2) Was ist die Bitness Ihres Betriebssystems/Ihres Computers? Der Grund, warum ich frage, ist, weil wenn Ihre ausführbare Datei zum Ausführen in 64-Bit kompiliert ist, dann müssen alle Abhängigkeiten auch im 64-Bit-Modus ausgeführt werden können. Ihr Any CPU-Assembly sollte geladen werden können, aber vielleicht wird auf eine andere Abhängigkeit verwiesen, die nur in der x86-Konfiguration ausgeführt werden kann. Überprüfen Sie alle Abhängigkeiten und Abhängigkeiten von Abhängigkeiten, um sicherzustellen, dass alles entweder "Any CPU" oder "x64" ist, wenn Sie planen, die ausführbare Datei im 64-Bit-Modus auszuführen. Andernfalls treten Probleme auf.

Auf viele Arten macht es Visual Studio nicht einfach, eine Mischung aus Any CPU und verschiedenen architekturabhängigen Assemblys zu kompilieren. Es ist möglich, aber oft erfordert es, dass ein Assembly, das sonst "Any CPU" wäre, separat für x86 und x64 kompiliert wird, weil irgendwo eine Abhängigkeit von einer Abhängigkeit zwei Versionen hat.

0 Stimmen

Ist die Konfiguration der ausführbaren Angelegenheit relevant, da ich beim Versuch, die DLLs zu erstellen, einen Fehler erhalte? (Es ist jedoch x86.) Mein Computer ist x64.

2 Stimmen

Es ist das ausführbare Programm, das bestimmt, welche Bitanzahl verwendet wird. Wenn das ausführbare Programm als x64 läuft, dann muss alles, was es lädt (direkt oder indirekt), x64 oder Any CPU sein. Wenn das ausführbare Programm als x86 läuft, dann muss alles, was es lädt (direkt oder indirekt), x86 oder Any CPU sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X