558 Stimmen

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

Ich bin neu in der Projekt-Konfiguration in Visual Studio 2010, aber ich habe einige Recherchen durchgeführt 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 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 zwischen der Prozessorarchitektur des Projekts, das erstellt wird ("MSIL") und der Prozessorarchitektur der Referenz "[internes C#-DLL]", "x86".

Es sagt mir, dass ich zum Konfigurations-Manager gehen soll, um meine Architekturen abzugleichen. Das C#-DLL ist mit der Zielplattform x86 eingerichtet. Wenn ich versuche, dies auf etwas anderes zu ändern, wie zum Beispiel Any CPU, beschwert es sich, weil eine der externen DLLs, von denen es abhängt, die 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. Dies scheint die richtige Konfiguration zu sein; sicherlich möchte ich nicht, dass das Projekt für mein C++-Projekt die Plattform auf x64 festgelegt hat, was die einzige andere Option ist, die präsentiert wird.

Was mache ich hier falsch?

0 Stimmen

Was ist die Beschwerde, insbesondere, wenn Sie es 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 -> Projekt-Bauauftrag und stellen Sie sicher, dass Ihr C#-Projekt vor dem C++-Projekt erstellt wird. Wenn nicht, gehen Sie zum Tab Abhängigkeiten und teilen Sie VS mit, dass das C++-Projekt vom C#-Projekt abhängt.

7 Stimmen

Visual Studio ist wieder Mist dabei. Die Plattform oben auf meinem Bildschirm zeigt x64 an, aber die Warnung besagt, dass das zu erstellende Projekt "MSIL" ist. Also sagt Visual Studio mir, 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 Anschauen der Gebäudekonfigurationen in Visual Studio half nicht weiter, weil es für sowohl das Projekt, das nicht gebaut wurde, als auch für das referenzierte Projekt Any CPU zeigte.

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

pdbonly
true
bin\Release\
TRACE
prompt
4
x64

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

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

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 zu Ihrem Lösungsordner hinzu
  • Fügen Sie dies ein:

    None

3voto

Dave Cousineau Punkte 10963

Zusätzlich zu Davids Sacks Antwort müssen Sie möglicherweise auch zum Build-Tab der Projekteigenschaften gehen und Plattformziel auf x86 für das Projekt festlegen, 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 auch x86 sein. Ich sehe nicht wirklich einen Ausweg. VS beschwert sich darüber, dass es beispielsweise auf x64 geändert werden soll, 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 ausgelegt war, da es die Plattform angegeben hat, die es anvisiert hatte, [MSIL], aber Sie haben angegeben, dass die Konfiguration des Projekts tatsächlich Win32 war. Eine native Win32-App sollte kein MSIL beinhalten - obwohl wahrscheinlich CLR-Unterstützung aktiviert sein müsste, wenn sie mit einer C#-Bibliothek interagiert. Ich denke also, dass es einige Lücken auf der Informationsseite gibt.

Könnte ich respektvoll darum bitten, dass Sie die genaue Konfiguration der Projekte überprüfen und etwas mehr Details darüber veröffentlichen, wie sie miteinander verbunden sind? Ich 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 diese Assembly nur x86-Architekturen unterstützt. Das Gleiche 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) Welche Bitness hat Ihr Betriebssystem/Computer? Der Grund, warum ich frage, ist, dass wenn Ihr Programm für die Ausführung in 64-Bit kompiliert ist, 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, jedoch könnte es sein, dass sie auf eine andere Abhängigkeit verweist, 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 planen, das Programm 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 machbar, erfordert jedoch oft, dass eine Assembly, die ansonsten "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 Bitness verwendet wird. Wenn das ausführbare Programm als x64 ausgeführt wird, muss alles, was es lädt (direkt oder indirekt), x64 oder Any CPU sein. Wenn das ausführbare Programm als x86 ausgeführt wird, 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