558 Stimmen

Wie behebe ich den Visual Studio-Kompilierfehler "Unstimmigkeit zwischen Prozessorarchitekturen"?

Ich bin neu in der Projektkonfiguration in Visual Studio 2010, aber ich habe einige Recherchen gemacht und kann dieses Problem immer noch nicht ganz verstehen. Ich habe eine Visual Studio-Lösung mit einem C++-DLL, das auf das C#-DLL verweist. Das C#-DLL verweist auf ein paar 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 Diskrepanz zwischen der Prozessorarchitektur des Projekts, das erstellt wird "MSIL" und der Prozessorarchitektur der Referenz "[interne C# dll]", "x86".

Es sagt mir, dass ich zum Konfigurations-Manager gehen soll, um meine Architekturen abzugleichen. Das C#-DLL ist mit der Plattformziel x86 eingerichtet. Wenn ich versuche, dies auf etwas anderes zu ändern, wie z.B. 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. Dies scheint die richtige Konfiguration zu sein; sicherlich möchte ich nicht, dass das Projekt für mein C++-Projekt auf x64 festgelegt ist, was die einzige andere Option darstellt.

Was mache ich hier falsch?

0 Stimmen

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

2 Stimmen

Ich habe nicht genug Informationen, um einen informierten Vorschlag zu machen, aber klicken Sie mit der rechten Maustaste auf Ihre Lösung -> Projektaufbau-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. Die Plattform oben auf meinem Bildschirm zeigt x64 an, aber die Warnung besagt, dass das Projekt, das erstellt wird, "MSIL" ist. Also sagt mir Visual Studio, dass es eine Diskrepanz zwischen Äpfeln und Orangen gibt, wenn ich keine Äpfel verwende. Können wir es in Visual Stupido umbenennen?

7voto

JBourne Punkte 150

Ich hatte heute dieses Problem und habe festgestellt, dass das Betrachten der Build-Konfigurationen in Visual Studio nicht geholfen hat, weil dort für das Projekt, das nicht erstellt wurde, und das Referenzprojekt beide Any CPU angezeigt wurden.

Ich habe dann im csproj des Referenzprojekts nachgesehen und das hier gefunden:

pdbonly
true
bin\Release\
TRACE
prompt
4
x64

Irgendwie wurde dieses PlatformTarget während einer Konfigurationsänderung hinzugefügt und das IDE schien es nicht zu bemerken.

Das Entfernen dieser Zeile aus dem Referenzprojekt 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 zu Ihrem Lösungsordner hinzu
  • Fügen Sie Folgendes hinzu:

    None

3voto

Dave Cousineau Punkte 10963

Zusätzlich zur Antwort von David Sacks müssen Sie möglicherweise auch zum Build-Registerkarte der Projekteigenschaften gehen und Plattformziel auf x86 für das Projekt einstellen, das Ihnen diese Warnungen gibt. Obwohl Sie erwarten würden, 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 von x86-basierten Abhängigkeiten abhängt, dann muss Ihre DLL selbst auch x86 sein. Ich sehe da wirklich keinen Ausweg. VS beschwert sich, dass man es nicht auf (zum Beispiel) x64 ändern kann, weil eine 64-Bit-Exe 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, legt nahe, dass es für AnyCPU ausgerichtet war, da die Plattform [MSIL] war, aber Sie haben angegeben, dass die Konfiguration des Projekts tatsächlich Win32 war. Eine nativen Win32-Anwendung sollte nicht MSIL involvieren - obwohl wahrscheinlich CLR-Unterstützung aktiviert sein muss, wenn sie mit einer C#-Bibliothek interagiert. Ich glaube also, 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, was es klingt. Es bedeutet, dass diese Assembly nur x86-Architekturen unterstützt. Gleiches gilt für x64. Auf der anderen Seite bedeutet Any CPU, dass es mir egal ist, welche Architektur, ich unterstütze beide. Die nächsten 2 Fragen lauten also (1) welche Konfiguration hat das ausführbare Programm, das diese DLLs verwendet? und (2) was ist die Bit-Breite Ihres Betriebssystems/Computers? Der Grund, warum ich frage, ist, dass wenn Ihr ausführbares Programm zum Ausführen in 64-Bit kompiliert wurde, dann MÜSSEN alle Abhängigkeiten auch im 64-Bit-Modus ausgeführt werden können. Ihre Any CPU-Assembly sollte geladen werden können, aber vielleicht wird auf eine andere Abhängigkeit verwiesen, die nur im x86-Modus 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 das ausführbare Programm im 64-Bit-Modus ausführen möchten. 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 erforderlich, dass eine Assembly, die sonst "Any CPU" wäre, getrennt für x86 und x64 kompiliert werden muss, 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, nur einen Fehler erhalte? (Es handelt sich jedoch um x86.) Mein Computer ist x64.

2 Stimmen

Es ist die ausführbare Datei, die bestimmt, welche Funktionalität verwendet wird. Wenn die ausführbare Datei als x64 ausgeführt wird, muss alles, was sie lädt (direkt oder indirekt), x64 oder Any CPU sein. Wenn die ausführbare Datei als x86 ausgeführt wird, muss alles, was sie 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