Ich habe ein Projekt, das 32/64-Bit erstellt und entsprechende 32/64-Bit-Abhängigkeiten aufweist. Ich möchte in der Lage sein, Konfigurationen zu wechseln und die richtige Referenz zu verwenden, weiß jedoch nicht, wie ich Visual Studio anweisen soll, die architekturgerechte Abhängigkeit zu verwenden.
Vielleicht gehe ich falsch vor, aber ich möchte in der Konfigurations-Dropdown-Liste zwischen x86 und x64 wechseln können und die referenzierte DLL muss die richtige Bitigkeit haben.
.net
visual-studio
64-bit
32bit-64bit
Jonathan Yee
quelle
quelle
Antworten:
Folgendes habe ich in einem früheren Projekt getan, für das die manuelle Ausgabe der .csproj-Datei (en) erforderlich ist. Sie benötigen außerdem separate Verzeichnisse für die verschiedenen Binärdateien, idealerweise Geschwister voneinander, und mit demselben Namen wie die Plattform, auf die Sie abzielen.
Öffnen Sie nach dem Hinzufügen der Referenzen einer einzelnen Plattform zum Projekt die .csproj in einem Texteditor. Fügen Sie vor dem ersten
<ItemGroup>
Element innerhalb des<Project>
Elements den folgenden Code hinzu, um festzustellen, auf welcher Plattform Sie ausgeführt werden (und auf welcher Sie aufbauen).Anschließend nehmen Sie für Ihre plattformspezifischen Referenzen Änderungen vor, z. B. die folgenden:
Beachten Sie die Verwendung der
$(CurrentPlatform)
Eigenschaft, die wir oben definiert haben. Sie können stattdessen Bedingungen verwenden, für die Assemblys für welche Plattform eingeschlossen werden sollen. Möglicherweise müssen Sie auch:$(PROCESSOR_ARCHITEW6432)
und$(PROCESSOR_ARCHITECTURE)
durch$(Platform)
, um NUR die Zielplattform der Projekte zu berücksichtigenIch hatte dies ursprünglich für ein internes Wiki bei der Arbeit geschrieben, habe es jedoch geändert und den gesamten Prozess in meinem Blog veröffentlicht , wenn Sie an den detaillierten schrittweisen Anweisungen interessiert sind.
quelle
AFAIK: Wenn für Ihr Projekt 32-Bit- oder 64-Bit-spezifische Referenzen erforderlich sind (z. B. COM-Interop-Assemblys) und Sie kein Interesse daran haben, die .csproj-Datei manuell zu bearbeiten, müssen Sie separate 32-Bit- und 32-Bit-Dateien erstellen 64-Bit-Projekte.
Ich sollte beachten, dass die folgende Lösung nicht getestet wurde, aber funktionieren sollte. Wenn Sie bereit sind, die .csproj-Datei manuell zu bearbeiten, sollten Sie in der Lage sein, das gewünschte Ergebnis mit einem einzigen Projekt zu erzielen. Die .csproj-Datei ist nur ein MSBuild-Skript. Eine vollständige Referenz finden Sie hier . Suchen Sie die
<Reference>
Elemente, nachdem Sie die .csproj-Datei in einem Editor geöffnet haben . Sie sollten in der Lage sein, diese Elemente in drei verschiedene Elementgruppen aufzuteilen : Referenzen, die nicht plattformspezifisch sind, x86-spezifische Referenzen und x64-spezifische Referenzen.In diesem Beispiel wird davon ausgegangen, dass Ihr Projekt mit Zielplattformen mit den Namen "x86" und "x64" konfiguriert ist.
Wenn Sie nun Ihre Projekt- / Lösungserstellungskonfiguration so einstellen, dass sie auf die x86- oder x64-Plattform abzielt, sollte sie jeweils die richtigen Referenzen enthalten. Natürlich müssen Sie mit den
<Reference>
Elementen herumspielen. Sie können sogar Dummy-Projekte einrichten, in denen Sie die x86- und x64-Referenzen hinzufügen, und dann einfach die erforderlichen<Reference>
Elemente aus diesen Dummy-Projektdateien in Ihre "echte" Projektdatei kopieren .Bearbeiten 1
Hier ist ein Link zu den allgemeinen MSBuild-Projektelementen, die ich versehentlich aus dem ursprünglichen Beitrag herausgelassen habe: http://msdn.microsoft.com/en-us/library/bb629388.aspx
quelle
Sie können eine Bedingung für eine ItemGroup für die DLL-Referenzen in der Projektdatei verwenden.
Dadurch überprüft Visual Studio den Zustand und die Referenzen erneut, wenn Sie die aktive Konfiguration ändern.
Fügen Sie einfach eine Bedingung für jede Konfiguration hinzu.
Beispiel:
quelle
Ich verweise in meinem Projekt auf die x86-DLLs, die sich beispielsweise in \ component \ v3_NET4 befinden. Bestimmte DLLs für x86 / x64 befinden sich in Unterordnern mit den Namen "x86" bzw. "x64".
Dann verwende ich ein vorgefertigtes Skript, das geeignete DLLs (x86 / x64) basierend auf $ (PlatformName) in den Ordner kopiert, auf den verwiesen wird.
Funktioniert bei mir.
quelle
Ein .NET-Build mit x86 / x64-Abhängigkeiten
Während alle anderen Antworten Ihnen eine Lösung bieten, um je nach Plattform unterschiedliche Builds zu erstellen, gebe ich Ihnen die Option, nur die "AnyCPU" -Konfiguration zu verwenden und einen Build zu erstellen, der mit Ihren x86- und x64-DLLs funktioniert.
Auflösung der richtigen x86 / x64-DLLs zur Laufzeit
Schritte:
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
Fügen Sie dieses Postbuild-Skript zu Ihrem Startprojekt hinzu, verwenden und ändern Sie die Pfade dieses Skripts, sodass alle Ihre x86 / x64-DLLs in die entsprechenden Unterordner Ihres Build-Bin \ x86 \ bin \ x64 \ kopiert werden
xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX86Dlls $(TargetDir)\x86 xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX64Dlls $(TargetDir)\x64
-> Wenn Sie die Anwendung jetzt starten, erhalten Sie eine Ausnahme, dass die Assembly nicht gefunden wurde.
Registrieren Sie das AssemblyResolve-Ereignis direkt am Anfang Ihres Anwendungseinstiegspunkts
mit dieser Methode:
Leistungen:
Nachteile: - Keine Fehler beim Kompilieren, wenn x86 / x64-DLLs nicht übereinstimmen. - Sie sollten trotzdem in beiden Modi testen!
Erstellen Sie optional eine zweite ausführbare Datei, die exklusiv für die x64-Architektur ist, mit Corflags.exe im Postbuild-Skript
Andere Varianten zum Ausprobieren: - Sie würden den AssemblyResolve-Ereignishandler nicht benötigen, wenn Sie andernfalls sicherstellen würden, dass die DLLs beim Start in Ihren Binärordner kopiert werden (Prozessarchitektur auswerten -> entsprechende DLLs von x64 / x86 in den Bin-Ordner und zurück verschieben.) - Bewerten Sie im Installationsprogramm die Architektur und löschen Sie Binärdateien auf falsche Architektur und verschieben Sie die richtigen in den Ordner bin.
quelle
Ich hatte das gleiche Problem und suchte eine ganze Weile nach einer anständigen Lösung. Die meisten Benutzer bieten die manuelle Bearbeitung von Visual Studio-Lösungsdateien an, was ziemlich mühsam, fehleranfällig und verwirrend ist, wenn diese bearbeiteten Dateien anschließend in der Visual Studio-Benutzeroberfläche untersucht werden. Als ich bereits aufgab, kam die Lösung von selbst. Es ist sehr ähnlich zu dem, was Micke in seiner obigen Antwort empfiehlt.
Im Account Manager habe ich wie gewohnt zwei separate Build-Ziele für x86- und x64-Plattformen erstellt. Als Nächstes habe ich meinem Projekt einen Verweis auf die x86-Assembly hinzugefügt. In diesem Punkt habe ich geglaubt, dass das Projekt nur für die x86-Erstellung konfiguriert ist und niemals für die x64-Konfiguration erstellt wird, es sei denn, ich werde es manuell bearbeiten, wie von Hugo oben vorgeschlagen.
Nach einer Weile vergaß ich schließlich die Einschränkung und startete versehentlich den x64-Build. Natürlich ist der Build fehlgeschlagen. Aber wichtig war die Fehlermeldung, die ich erhalten habe. Die Fehlermeldung besagt, dass die Assembly, die genau so benannt ist, wie meine referenzierte x86-Assembly, in dem Ordner fehlt, der als x64-Build-Ziel für meine Lösung vorgesehen ist.
Nachdem ich dies bemerkt habe, habe ich die richtige x64-Assembly manuell in dieses Verzeichnis kopiert. Ruhm! Mein x64-Build war auf wundersame Weise erfolgreich, da die richtige Assembly implizit gefunden und verknüpft wurde. Es war nur eine Frage von Minuten, meine Lösung zu ändern, um ein Build-Zielverzeichnis für die x64-Assembly in diesem Ordner festzulegen. Nach diesen Schritten wird die Lösung automatisch für x86 und x64 erstellt, ohne dass MSBuild-Dateien manuell bearbeitet werden müssen.
Um zusammenzufassen:
Nach Abschluss dieser Schritte wird Ihre Lösung ordnungsgemäß für x86- und x64-Konfigurationen erstellt.
Dies funktionierte für mich im Visual Studio 2010 .NET 4.0 C # -Projekt. Offensichtlich handelt es sich hierbei um eine Art undokumentiertes internes Verhalten von Visual Studio, das in den Versionen 2012, 2013 und 2015 möglicherweise geändert wird. Wenn jemand andere Versionen anprobiert, teilen Sie uns bitte Ihre Erfahrungen mit.
quelle
Am Ende habe ich eine meiner Meinung nach einfachere Lösung verwendet, die eine Art Umkehrung von Mickes ist. Das Projekt ist eine C # -Formular-App, Visual Studio 2015, mit x86- und x64-Zielen. Ich habe auf eine der .NET-Assemblys verwiesen und die 32-Bit-Assembly verwendet. In den Referenzeigenschaften habe ich "Copy Local" auf false gesetzt. Dann lege ich einfach manuell die entsprechende (32 oder 64 Bit) .Net-Assembly in jedes Zielverzeichnis. Die tatsächliche Referenzbitität ist irrelevant, vorausgesetzt, sie verfügen über dieselben Funktionen, da sie nur die externe Schnittstelle definiert. Sie können auch einen Post-Build-Kopierschritt ausführen, wenn Sie Lust haben. Beachten Sie, dass dieses Projekt auch eine COM-Referenz hatte, dasselbe funktioniert. Die Referenz definiert die Objekte / Schnittstellen, sodass die Bitigkeit der Referenz-DLL irrelevant ist. Wenn sowohl 32-Bit- als auch 64-Bit-COM-DLLs registriert sind, Die App sucht an der entsprechenden Stelle in der Registrierung und erstellt das richtige 32- oder 64-Bit-COM-Objekt. Funktioniert bei mir!
quelle