.net - tutorial - visual studio wiki




Wie behebe ich den Visual Studio-Kompilierfehler "Mismatch zwischen Prozessor-Architektur"? (12)

Die C # -DLL ist mit dem Plattformziel x86 eingerichtet

Welches ist das Problem, eine DLL nicht wirklich zu wählen, was die Bitterkeit des Prozesses sein wird. Das wird vollständig vom EXE-Projekt bestimmt, das ist die erste Assembly, die geladen wird, so dass die Platform-Zieleinstellung diejenige ist, die zählt und die Bissigkeit für den Prozess einstellt.

Die DLLs haben keine Wahl, sie müssen mit der Prozessbits kompatibel sein. Wenn dies nicht der Fall ist, erhalten Sie einen großen Kaboom mit einer BadImageFormatException, wenn Ihr Code versucht, sie zu verwenden.

Also eine gute Auswahl für die DLLs ist AnyCPU, so dass sie in beide Richtungen funktionieren. Das ist sehr sinnvoll für C # DLLs, sie funktionieren auf jede Art und Weise. Aber sicher, nicht Ihre C ++ / CLI DLL im gemischten Modus, enthält nicht verwalteten Code, der nur gut funktioniert, wenn der Prozess im 32-Bit-Modus läuft. Sie können das Build-System veranlassen, Warnungen darüber zu generieren. Was genau du hast. Nur Warnungen, es baut sich immer noch richtig auf.

Stoße einfach das Problem an. Legen Sie das Platform-Ziel des EXE-Projekts auf x86 fest, es funktioniert nicht mit anderen Einstellungen. Und behalten Sie alle DLL-Projekte bei AnyCPU.

Ich bin neu in der Projektkonfiguration in Visual Studio 2010, aber ich habe einige research und kann dieses Problem noch nicht richtig erkennen. 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 extern. Wenn ich versuche, die C ++ DLL zu kompilieren, erhalte ich folgende Warnung:

warning MSB3270: Es gab eine Diskrepanz zwischen der Prozessorarchitektur des zu erstellenden Projekts "MSIL" und der Prozessorarchitektur der Referenz "[interne C # dll]", "x86".

Es sagt mir, dass ich zum Konfigurationsmanager gehen soll, um meine Architekturen auszurichten. Die C # -DLL ist mit dem Plattformziel x86 eingerichtet. Wenn ich versuche, dies in etwas anderes zu ändern, wie Any CPU, beschwert es sich, weil eine der externen DLLs, auf die es ankommt, platform target x86 hat.

Wenn ich Configuration Manager ansehe, wird die Plattform für meine C # DLL als x86 und für mein C ++ Projekt als Win32 angezeigt. Dies scheint die richtige Einstellung zu sein; sicherlich möchte ich nicht, dass das Projekt für mein C ++ - Projekt die Plattform auf x64 setzt, was die einzige andere Option ist.

Was mache ich hier falsch?


Dies ist eine sehr sture Warnung, und obwohl es eine gültige Warnung ist, gibt es einige Fälle, in denen es aufgrund der Verwendung von Komponenten von Drittanbietern und anderen Gründen nicht gelöst werden kann. Ich habe ein ähnliches Problem, außer dass die Warnung ist, weil meine Projektplattform AnyCPU ist und ich eine MS-Bibliothek referenziere, die für AMD64 gebaut wird. Dies ist übrigens in Visual Studio 2010 und scheint durch die Installation von VS2012 und .Net 4.5 eingeführt zu werden.

Da ich die MS-Bibliothek, die ich verweise, nicht ändern kann, und da ich weiß, dass meine Zielimplementierungsumgebung immer nur 64-Bit sein wird, kann ich dieses Problem ignorieren.

Was ist mit der Warnung? Microsoft hat als Reaktion auf einen Connect-Bericht angegeben, dass eine Option darin besteht, diese Warnung zu deaktivieren. Sie sollten dies nur tun, wenn Sie sich Ihrer Lösungsarchitektur sehr bewusst sind und Ihr Implementierungsziel vollständig verstanden haben und wissen, dass dies außerhalb der Entwicklungsumgebung kein Problem darstellt.

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

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

Eine gute Faustregel ist "offene DLLs, geschlossene EXEs", also:

  • EXE zielt auf das Betriebssystem ab, indem x86 oder x64 angegeben wird.
  • DLLs bleiben offen (dh AnyCPU), so dass sie innerhalb eines 32-Bit- oder eines 64-Bit-Prozesses instanziiert werden können.

Wenn Sie eine EXE als AnyCPU erstellen, verschieben Sie lediglich die Entscheidung, welche Prozess-Bitness für das Betriebssystem verwendet werden soll, was JIT die EXE nach seinen Wünschen unterstützt. Das heißt, ein x64-Betriebssystem erstellt einen 64-Bit-Prozess, ein x86-Betriebssystem erstellt einen 32-Bit-Prozess.

Das Erstellen von DLLs als AnyCPU macht sie für beide Prozesse kompatibel.

Weitere Informationen zu Feinheiten beim Laden von Baugruppen finden Sie here . Die Zusammenfassung liest so etwas wie:

  • AnyCPU - wird je nach Aufrufen als x64- oder x86-Assembly geladen
  • x86 - lädt als x86-Baugruppe; wird nicht von einem x64-Prozess geladen
  • x64 - lädt als x64-Baugruppe; wird nicht von einem x86-Prozess geladen

Es sollte eine Möglichkeit geben, eine .NET EXE / DLL AnyCPU und alle nicht verwalteten DLLs, die davon abhängig sind, sowohl mit x86 als auch mit x64 zu kompilieren, beide möglicherweise mit verschiedenen Dateinamen kombiniert, und dann lädt das .NET-Modul dynamisch das korrekte, basierend auf seiner Laufzeit Prozessorarchitektur. Das würde AnyCPU mächtig machen. Wenn die C ++ DLL nur x86 oder x64 unterstützt, dann ist AnyCPU natürlich sinnlos. Aber die Bündelung der beiden Ideen, die ich als Konfigurationsmanager noch nicht implementiert habe, bietet noch nicht einmal die Möglichkeit, das gleiche Projekt zweimal mit einer anderen Konfiguration / Plattform für Mehrfachbündelung zu erstellen, so dass AnyCPU oder andere Konzepte wie jede Konfiguration möglich sind.


Für mein Projekt muss ich in der Lage sein, sowohl x86 als auch x64 zu erstellen. Das Problem dabei ist, dass jedes Mal, wenn Sie während der Verwendung von Referenzen Referenzen hinzufügen, sich beim Erstellen des anderen beschwert.

Meine Lösung besteht darin, die * .csproj-Dateien manuell so zu bearbeiten, dass folgende Zeilen angezeigt werden:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

ändere dich dazu:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

Ich erhielt die gleiche Warnung, die ich tat:

  1. Projekt entladen
  2. Projekteigenschaften bearbeiten, zB .csproj
  3. Fügen Sie das folgende Tag hinzu:

    <PropertyGroup>
        <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
            None
        </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    </PropertyGroup>
    
  4. Laden Sie das Projekt neu


Ich habe diese Warnung in Visual Studio 2012 beim Kompilieren einer SQL Server 2012 SP1 SSIS-Pipelineskriptaufgabe erhalten - bis ich SQL Server 2012 SP2 installiert habe.


Ich hatte ähnliches Problem, das durch MS UNIT Test DLL verursacht wurde. Meine WPF-Anwendung wurde als x86, aber Unit-Test-DLL (referenzierte EXE-Datei) als "Any CPU" kompiliert. Ich änderte Unit-Test-DLL, um für x86 (wie EXE) kompiliert zu werden, und es wurde resovled.


Ich hatte dieses Problem heute und nur die Gebäudekonfigurationen in Visual Studio zu suchen, hat nicht geholfen, weil es jede CPU für das Projekt, das nicht erstellt wurde, und das referenzierte Projekt zeigte.

Ich habe dann im csproj des referenzierten Projekts gesucht und folgendes gefunden:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

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

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


Ich hatte eine sehr ähnliche Warnung in meinem Build. Meine Projekte waren auf .NET 4.5 ausgerichtet, auf dem Build-Server wurde das Windows 8.1 SDK (für .NET 4.5.1) installiert. Nach dem Update meiner Projekte auf .NET 4.5.1 Ziel (war für mich kein Problem, war für eine komplett neue Anwendung), erhielt ich die Warnung nicht mehr ...



Wenn Ihre C # DLL x86-basierte Abhängigkeiten hat, dann wird Ihre DLL selbst x86 sein müssen. Ich sehe das nicht wirklich so. VS beschwert sich darüber, es beispielsweise zu x64 zu ändern, weil eine 64-Bit-Programmdatei keine 32-Bit-Bibliotheken laden kann.

Ich bin etwas verwirrt über die Konfiguration des C ++ Projekts. Die Warnmeldung, die für den Build bereitgestellt wurde, weist darauf hin, dass sie auf AnyCPU abzielte, da die Plattform, auf die sie abzielte, [MSIL] gemeldet wurde, Sie jedoch angegeben haben, dass die Konfiguration für das Projekt tatsächlich Win32 war. Eine native Win32-App sollte die MSIL nicht enthalten - obwohl die CLR-Unterstützung wahrscheinlich aktiviert sein müsste, wenn sie mit einer C # -Bibliothek interagiert. Ich denke also, dass es auf der Informationsseite einige Lücken gibt.

Könnte ich Sie respektvoll bitten, die genaue Konfiguration der Projekte und deren Zusammenhang zu überprüfen und etwas detaillierter zu veröffentlichen? Sei froh, wenn möglich weiter zu helfen.





visual-studio