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?

612voto

David Sacks Punkte 6306

Diese Warnung scheint mit dem neuen Visual Studio 11 Beta und .NET 4.5 eingeführt worden zu sein, obwohl es vielleicht schon vorher möglich war.

Zunächst einmal handelt es sich hierbei nur um eine Warnung. Es sollte nichts ausmachen, wenn Sie nur mit x86-Abhängigkeiten umgehen. Microsoft versucht nur, Sie zu warnen, wenn Sie angeben, dass Ihr Projekt mit "Any CPU" kompatibel ist, aber eine Abhängigkeit von einem Projekt oder einer .dll-Assembly haben, die entweder x86 oder x64 ist. Da Sie eine x86-Abhängigkeit haben, ist Ihr Projekt technisch gesehen daher nicht "Any CPU"-kompatibel. Um die Warnung zu beseitigen, sollten Sie Ihr Projekt tatsächlich von "Any CPU" auf "x86" ändern. Dies ist sehr einfach zu tun, hier sind die Schritte.

  1. Gehen Sie zum Menüpunkt Build|Konfigurations-Manager.
  2. Finden Sie Ihr Projekt in der Liste, unter Plattform wird "Any CPU" stehen.
  3. Wählen Sie die Option "Any CPU" aus dem Dropdown-Menü und wählen Sie dann
  4. Wählen Sie in diesem Dialogfeld x86 aus dem Dropdown-Menü "Neue Plattform" aus und stellen Sie sicher, dass "Any CPU" im Dropdown-Menü "Einstellungen kopieren von" ausgewählt ist.
  5. Klicken Sie auf OK
  6. Sie sollten sowohl für die Debug- als auch für die Release-Konfiguration x86 auswählen.

Dadurch verschwindet die Warnung und es wird auch angezeigt, dass Ihre Assembly oder Ihr Projekt jetzt nicht mehr "Any CPU"-kompatibel, sondern speziell für x86 ist. Dies gilt auch, wenn Sie ein 64-Bit-Projekt erstellen, das eine x64-Abhängigkeit hat; dann würden Sie einfach x64 auswählen.

Eine weitere Anmerkung: Projekte können in der Regel "Any CPU"-kompatibel sein, wenn es sich um reine .NET-Projekte handelt. Dieses Problem tritt nur auf, wenn Sie eine Abhängigkeit (Drittanbieter-DLL oder Ihr eigenes C++-Managed-Projekt) einführen, das auf eine bestimmte Prozessorarchitektur abzielt.

3 Stimmen

Ich habe gerade die RTW von Visual Studio 2012 installiert und eine bereits bestehende Lösung von 2010 geöffnet und angefangen, dieselbe Warnung zu sehen, daher ist es etwas, das in der RTW immer noch vorhanden ist.

7 Stimmen

Das gesagt, ich denke, Davids Antwort ist korrekt, diese Warnung informiert Sie darüber, dass Ihre App wirklich nicht "AnyCPU" ist, daher werden Sie Probleme haben, wenn Sie sie schließlich auf die falsche Architektur bereitstellen.

9 Stimmen

Es kann tatsächlich etwas schaden. Eine Any CPU-Exe wird auf einem 64-Bit-Betriebssystem als x64 geladen und kann x86-DLLs nicht laden. Wenn Sie also von einer bestimmten Plattform abhängig sind, sollten Sie Ihre Plattform wirklich korrekt festlegen.

164voto

Gio Punkte 1994

Dies ist eine sehr hartnäckige Warnung und obwohl es eine gültige Warnung ist, gibt es einige Fälle, in denen sie aufgrund der Verwendung von Komponenten von Drittanbietern und aus anderen Gründen nicht behoben werden kann. Ich habe ein ähnliches Problem, nur dass die Warnung auftritt, weil die Plattform meines Projekts AnyCPU ist und ich eine MS-Bibliothek verwende, die für AMD64 entwickelt wurde. Dies geschieht übrigens in Visual Studio 2010 und scheint durch die Installation von VS2012 und .Net 4.5 eingeführt zu werden.

Da ich die von mir referenzierte MS-Bibliothek nicht ändern kann und da ich weiß, dass meine Zielausführungsumgebung immer nur 64-Bit sein wird, kann ich dieses Problem sicher ignorieren.

Was ist mit der Warnung? Microsoft hat als Antwort auf einen Connect-Bericht geschrieben, dass eine Option darin besteht, diese Warnung zu deaktivieren. Sie sollten dies nur tun, wenn Sie sich sehr über die Architektur Ihrer Lösung im Klaren sind und Ihr Bereitstellungsziel vollständig verstehen und wenn Sie wissen, dass es außerhalb der Entwicklungsumgebung kein wirkliches Problem darstellt.

Sie können Ihre Projektdatei bearbeiten und diese Eigenschaftsgruppe und Einstellung hinzufügen, um die Warnung zu deaktivieren:

  None

1 Stimmen

Die einzige andere offizielle MS-Referenz zu dieser Lösung, die ich gesehen habe, befindet sich in der Microsoft .NET Framework 4.5 RC Readme-Datei. Seltsamerweise wurde sie aus der RTM-Readme-Datei entfernt.

4 Stimmen

Dies funktioniert, jedoch nicht für eine Variation der Warnung: "Verwiesener Assembly ... zielt auf einen anderen Prozessor als die Anwendung". Wäre es toll, wenn es eine ähnliche Einstellung für diese Warnung gäbe?

9 Stimmen

"Meine Projektplattform ist AnyCPU und ich verwende eine MS-Bibliothek, die für AMD64 erstellt wurde"... Das ist FALSCH. Da Ihr Zielbereitstellung immer 64-Bit ist, können Sie Ihre Plattform auf x64 setzen, was zu einem angemesseneren Fehler führt, wenn Ihre 64-Bit-Annahme jemals verletzt wird, und auch das Warnsignal verhindert.

73voto

Gustavo Mori Punkte 8033

Ein guter Faustregel lautet "offene DLLs, geschlossene EXEs", das heißt:

  • EXE zielt auf das Betriebssystem ab, indem es x86 oder x64 angibt.
  • DLLs bleiben offen (d.h. AnyCPU), damit sie innerhalb eines 32-Bit- oder 64-Bit-Prozesses instanziiert werden können.

Wenn Sie eine EXE als AnyCPU erstellen, verschieben Sie nur die Entscheidung darüber, welche Prozessbitanz vom Betriebssystem verwendet werden soll, das die EXE nach eigenem Ermessen kompiliert. Das heißt, ein x64-Betriebssystem wird einen 64-Bit-Prozess erstellen, ein x86-Betriebssystem einen 32-Bit-Prozess.

Das Kompilieren von DLLs als AnyCPU macht sie kompatibel für jeden Prozess.

Weitere Informationen zu den Feinheiten des Assembly-Ladens finden Sie hier. Die Zusammenfassung lautet ungefähr wie folgt:

  • AnyCPU – lädt als x64- oder x86-Assembly, abhängig vom aufrufenden Prozess
  • x86 – lädt als x86-Assembly; wird nicht aus einem x64-Prozess geladen
  • x64 – lädt als x64-Assembly; wird nicht aus einem x86-Prozess geladen

4 Stimmen

Diese Regel macht für mich Sinn. Aber betrachten Sie die folgende Situation: Native.dll (x64) wird von NetA.dll (Any CPU) verwendet, das von NetB.dll (Any CPU) verwendet wird, das von App1.exe (x64) verwendet wird. Hier gibt es kein wirkliches Problem, aber beim Kompilieren von NetA.dll erhalte ich die Warnung. OK, da dieses Assembly direkt von Native.dll abhängt, könnte ich es auch als x64 markieren. Aber dann beschwert sich das Kompilieren von NetB.dll. Ich möchte NetB.dll weiterhin als "Any CPU" behalten, da es ein gemeinsames Assembly ist, das in einer anderen reinen .NET-Anwendung verwendet wird. Ich komkludiere, dass meine einzige Option ist, die Warnung zu unterdrücken/ignorieren. Richtig?

2 Stimmen

Aufgrund der Abhängigkeit von Native.dll ist Ihre gesamte App/Assembly-Reihe jetzt x64, unabhängig davon, ob Sie die Warnung unterdrücken oder nicht. Während die Unterdrückung in Ihrem Szenario funktioniert, könnten in Zukunft seltsame Situationen auftreten. Zum Beispiel 1) wird die Assembly NetB in einer x86-Umgebung verwendet, wo Nativex64 nicht geladen wird, oder 2) Ihr Kunde möchte eine x86-Version von App1.exe, und Sie kompilieren fröhlich, da NetB als any CPU markiert ist, aber auch hier wird Nativex64 oben im Stapel nicht geladen.

0 Stimmen

Da die Regel von Gustavo ein guter Grundsatz ist, kann sie für das spezifische Problem, das in dieser Frage gestellt wurde, nicht verwendet werden, da das Projekt bereits von einer Drittanbieter-Baugruppe abhängig ist, die der Regel nicht gefolgt ist (es handelt sich um x86, nicht AnyCPU). Daher müssen solange diese Abhängigkeit besteht, alle Projektketten auf x86 abzielen und nichts anderes.

24voto

Hans Passant Punkte 894572

Die C# DLL ist mit dem Plattformziel x86 eingerichtet

Das ist irgendwie das Problem, eine DLL kann tatsächlich nicht wählen, welche Bittigkeit der Prozess haben wird. Das wird vollständig vom EXE-Projekt bestimmt, das die erste Assembly ist, die geladen wird, sodass seine Plattformziel-Einstellung zählt und die Bittigkeit für den Prozess festlegt.

Die DLLs haben keine Wahl, sie müssen mit der Bittigkeit des Prozesses kompatibel sein. Wenn sie das nicht sind, bekommen Sie einen großen Knall mit einer BadImageFormatException, wenn Ihr Code versucht, sie zu verwenden.

Also ist eine gute Auswahl für die DLLs AnyCPU, damit sie auf beide Arten funktionieren. Das macht viel Sinn für C# DLLs, sie funktionieren nämlich auf beide Arten. Aber sicher, nicht für Ihre C++/CLI-Mixed-Mode-DLL, die nicht verwalteten Code enthält, der nur gut funktionieren kann, wenn der Prozess im 32-Bit-Modus läuft. Sie können das Build-System dazu bringen, Warnungen dazu zu generieren. Genau das haben Sie bekommen. Nur Warnungen, es baut trotzdem ordnungsgemäß.

Verlagern Sie das Problem einfach. Setzen Sie das Plattformziel des EXE-Projekts auf x86, das wird mit keiner anderen Einstellung funktionieren. Und behalten Sie alle DLL-Projekte einfach bei AnyCPU.

1 Stimmen

Also, um es klar zu sagen: Ich baue nicht die EXE, sondern ich baue eine DLL, die mit der EXE von jemand anderem ausgeführt werden soll. Das Ändern des Plattformziels der C# DLLs auf "Jede CPU" beseitigt die Warnung nicht. Ich frage mich, ob dies ein Fall von connect.microsoft.com/VisualStudio/feedback/details/728901/… ist - Ich würde die Warnung selbst ignorieren, aber tatsächlich kann die EXE die C# DLL laden, aber nicht die C++ DLL, daher denke ich, dass dies ein echtes Problem ist.

0 Stimmen

Benutzen Sie tatsächlich VS2010? Es war auch überhaupt nicht klar, dass Sie die C++/CLI DLL nicht laden konnten. Was ist die Diagnose? Aktualisieren Sie Ihre Fragen mit diesen wesentlichen Informationen.

0 Stimmen

Ich hatte mich nicht über den Ladefehler geäußert, weil ich mir nicht zu 100% sicher war, ob er damit zusammenhängt, und bei weiteren Debugging-Versuchen stellt sich heraus, dass dem nicht so ist. Ich benutze VS2010. Frage aktualisiert. Entschuldigung für die Verwirrung.

9voto

yogeshwar gutte Punkte 119

Ich erhielt dieselbe Warnung, als ich Folgendes tat:

  1. Projekt entladen

  2. Projekteigenschaften bearbeiten, d.h. .csproj

  3. Fügen Sie das folgende Tag hinzu:

            Keine
  4. Projekt neu laden

5 Stimmen

Das löst das Problem nicht. Es deaktiviert lediglich die Warnung für das spezielle Projekt. Aber in manchen Fällen finde ich das eine gültige Lösung. Danke!

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