558 Stimmen

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

Ich bin neu in der Projektkonfiguration in Visual Studio 2010, aber ich habe einige Recherche betrieben und kann dieses Problem immer noch nicht ganz lösen. Ich habe eine Visual Studio-Lösung mit einer C++ DLL, die auf die C# DLL verweist. Die C# DLL verweist auf einige andere DLLs, einige innerhalb meines Projekts und einige externe. Wenn ich versuche, die C++ DLL zu kompilieren, erhalte ich diese Warnung:

Warnung MSB3270: Es gab eine Unstimmigkeit 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 anzupassen. Die C# DLL ist mit dem Plattformziel x86 eingerichtet. Wenn ich versuche, dies auf etwas anderes wie Any CPU zu ändern, beschwert es sich, weil eine der externen DLLs, von der sie abhängt, das Plattformziel x86 hat.

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

Was mache ich hier falsch?

0 Stimmen

Was ist die Beschwerde, speziell, wenn man sie auf Any CPU ändert?

2 Stimmen

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

7 Stimmen

Visual Studio ist wieder Mist in diesem Fall. Die Plattform oben auf meinem Bildschirm zeigt x64 an, aber die Warnung besagt, dass das Projekt, das gebaut wird, "MSIL" ist. Also sagt mir Visual Studio, dass es einen Unterschied 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 Betrachten der Gebäudekonfigurationen in Visual Studio hat nicht geholfen, weil es für beide das Projekt, das nicht erstellt wurde, und das referenzierte Projekt Any CPU zeigte.

Dann habe ich im csproj des referenzierten Projekts nachgesehen und Folgendes gefunden:

pdbonly
true
bin\Release\
TRACE
prompt
4
x64

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

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

0 Stimmen

Es hat mich einen ganzen Tag gedauert, 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 in Ihren Lösungsordner ein
  • fügen Sie dies dort ein:

    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 es vielleicht erwarten, scheint diese Einstellung nicht perfekt mit der Einstellung im Konfigurations-Manager synchronisiert zu sein.

3voto

David W Punkte 9972

Wenn Ihre C# DLL x86-abhängige Komponenten hat, muss Ihre DLL selbst auch x86 sein. Ich sehe nicht wirklich einen Weg darum herum. VS beschwert sich darüber, 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, weil es die Plattform gemeldet hat, die es [MSIL] anvisiert hat, aber Sie haben angegeben, dass die Konfiguration des Projekts tatsächlich Win32 war. Eine native Win32-App sollte nicht das MSIL beinhalten - obwohl sie wahrscheinlich CLR-Unterstützung aktiviert haben sollte, wenn sie mit einer C#-Bibliothek interagiert. Ich glaube also, dass es ein paar Informationslücken gibt.

Könnte ich Sie höflich bitten, die genaue Konfiguration der Projekte zu überprüfen und etwas mehr darüber zu veröffentlichen, wie sie miteinander verbunden sind? Ich würde mich freuen, weiter zu helfen, wenn möglich.

2voto

Jonathan DeCarlo Punkte 2768

Für C#-Projekte bedeutet das Ziel x86 genau das, was es klingt. Es besagt, dass diese Assembly nur x86-Architekturen unterstützt. Gleiches gilt für x64. Any CPU hingegen besagt, dass es mir egal ist, welche Architektur, ich unterstütze beide. Die nächsten 2 Fragen lauten also (1) Was ist die Konfiguration der ausführbaren Datei, die diese DLLs verwendet? und (2) Was ist die Bitness Ihres Betriebssystems/Ihres Computers? Ich frage deshalb, weil wenn Ihre ausführbare Datei zum Ausführen in 64-Bit kompiliert ist, dann MÜSSEN alle Abhängigkeiten auch in der Lage sein, im 64-Bit-Modus ausgeführt zu werden. Ihre Any CPU-Assembly sollte geladen werden können, aber vielleicht wird auf eine andere Abhängigkeit verwiesen, die nur im x86-Format 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 möchten. Andernfalls treten Probleme auf.

In vielerlei Hinsicht erleichtert Visual Studio das Kompilieren einer Mischung aus Any CPU und verschiedenen architekturabhängigen Assemblys nicht. Es ist machbar, erfordert aber oft, dass eine Assembly, die ansonsten "Any CPU" wäre, separat 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, einen Fehler erhalte? (Es ist x86) Mein Computer ist x64.

2 Stimmen

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