558 Stimmen

Wie behebe ich den Kompilierungsfehler von Visual Studio "Mismatches zwischen Prozessorarchitekturen"?

Ich bin neu in der Projektkonfiguration in Visual Studio 2010, aber ich habe einige Forschung betrieben und kann dieses Problem immer noch nicht ganz lösen. Ich habe eine Visual Studio-Lösung mit einem C++-DLL, das auf das C#-DLL verweist. Das C#-DLL verweist auf 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 eine Inkonsistenz zwischen der Prozessorarchitektur des 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 dem Zielplattform x86 eingerichtet. Wenn ich versuche, dies auf etwas anderes zu ändern, wie z.B. Any CPU, beschwert es sich, weil eine der externen DLLs, auf die es sich bezieht, das Zielplattform 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 eingestellt ist, was die einzige andere Option ist, die präsentiert wird.

Was mache ich hier falsch?

0 Stimmen

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

2 Stimmen

Ich habe nicht genug Informationen, um einen fundierten Vorschlag zu machen, aber klicken Sie mit der rechten Maustaste auf Ihre Lösung -> Projektbuildreihenfolge und stellen Sie sicher, dass Ihr C#-Projekt vor dem C++-Projekt erstellt wird. Wenn nicht, gehen Sie zum Registerkarte Abhängigkeiten und geben Sie VS Bescheid, dass das C++-Projekt vom C#-Projekt abhängt.

7 Stimmen

Visual Studio ist wieder Mist. Die Plattform oben auf meinem Bildschirm zeigt x64 an, aber die Warnung besagt, dass das Projekt "MSIL" erstellt wird. Visual Studio sagt mir also, dass es einen Missmatch zwischen Äpfeln und Orangen gibt, obwohl 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 hat nicht geholfen, weil es für sowohl das Projekt, das nicht erstellt wurde, als auch das referenzierte Projekt Any CPU angezeigt hat.

Ich habe dann in der csproj des referenzierten Projekts gesucht und dies gefunden:

pdbonly
true
bin\Release\
TRACE
prompt
4
x64

Irgendwie wurde dieses PlatformTarget mitten in einer Konfigurationsänderung hinzugefügt und die IDE schien es nicht zu sehen.

Das Entfernen dieser Zeile aus dem referenzierten Projekt hat mein Problem gelöst.

0 Stimmen

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

5voto

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

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

    None

3voto

Dave Cousineau Punkte 10963

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

3voto

David W Punkte 9972

Wenn Ihre C# DLL von x86-basierten Abhängigkeiten abhängt, muss Ihre DLL selbst x86 sein. Ich sehe wirklich keinen Weg daran vorbei. VS beschwert sich darüber, dass es beispielsweise zu x64 geändert wird, weil eine 64-Bit-Executable 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 ausgerichtet war, weil die Plattform, die es anzielte, [MSIL] war, aber Sie haben angegeben, dass die Konfiguration des Projekts tatsächlich Win32 war. Eine native Win32-App sollte nicht MSIL einbeziehen - obwohl sie wahrscheinlich CLR-Unterstützung aktiviert haben müsste, wenn sie mit einer C#-Bibliothek interagiert. Daher denke ich, dass es einige Informationslücken gibt.

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

2voto

Jonathan DeCarlo Punkte 2768

Für C#-Projekte tut das Ziel von x86 das, was es klingt. Es besagt, dass dieses Assembly nur x86-Architekturen unterstützt. Ebenso für x64. Any CPU hingegen besagt, dass es mir egal ist, welche Architektur, ich unterstütze beide. Die nächsten 2 Fragen sind also (1) was ist die Konfiguration der ausführbaren Datei, die diese dlls verwendet? und (2) was ist die Bits-Version Ihres Betriebssystems/Computers? Ich frage deshalb, weil wenn Ihre ausführbare Datei für 64-bit kompiliert ist, dann MÜSSEN alle Abhängigkeiten in der Lage sein, im 64-Bit-Modus ausgeführt zu werden. Ihr Any CPU-Assembly sollte geladen werden können, aber vielleicht bezieht es sich auf eine andere Abhängigkeit, 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 die ausführbare Datei im 64-Bit-Modus ausführen wollen. Andernfalls werden Sie Probleme haben.

Auf viele Arten macht es Visual Studio nicht einfach, eine Mischung aus Any CPU und verschieden architekturabhängigen Assemblies zu kompilieren. Es ist machbar, aber oft erfordert es, dass ein Assembly, das ansonsten "Any CPU" wäre, separat für x86 und x64 kompiliert werden muss, weil irgendwo eine Abhängigkeit einer Abhängigkeit zwei Versionen hat.

0 Stimmen

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

2 Stimmen

Es ist das ausführbare Programm, das bestimmt, welche Bit-Architektur verwendet wird. Wenn das ausführbare Programm als x64 ausgeführt wird, müssen alles, was es (direkt oder indirekt) lädt, x64 oder Any CPU sein. Wenn das ausführbare Programm als x86 ausgeführt wird, müssen alles, was es (direkt oder indirekt) lädt, 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