Ja, können Sie sowohl die x86 und x64 mit der gleichen Code-Basis im selben Projekt zielen. Im Allgemeinen funktionieren die Dinge nur dann, wenn Sie die richtigen Lösungskonfigurationen in VS.NET erstellen (obwohl P/Invoke für vollständig nicht verwaltete DLLs höchstwahrscheinlich bedingten Code erfordern wird): Die Elemente, die ich als besondere Aufmerksamkeit benötige, sind:
- Verweise auf außerhalb verwalteten Assemblys mit demselben Namen, aber ihre eigenen spezifischen Bitness (dies gilt auch für COM-Interop Assemblies)
- Das MSI-Paket (die, wie bereits erwähnt wurde, entweder x86 oder x64 Ziel muß)
- Alle benutzerdefinierten .NET Installer-klassenbasierten Aktionen in Ihrem MSI-Paket
Das Assemblyreferenzproblem kann nicht vollständig innerhalb von VS.NET gelöst werden, da Sie nur einmal einen Verweis mit einem bestimmten Namen zu einem Projekt hinzufügen können. Um dies zu umgehen, bearbeiten Sie Ihre Projektdatei manuell (in VS klicken Sie mit der rechten Maustaste auf Ihre Projektdatei im Projektmappen-Explorer, wählen Sie Projekt entladen, klicken Sie erneut mit der rechten Maustaste und wählen Sie Bearbeiten). Nach der Zugabe wird eine Referenz auf, sagen wir, die x86-Version einer Assembly, die Projektdatei so etwas wie enthalten:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Wrap, das Tag innerhalb einer ItemGroup Tag, welche die Lösungskonfiguration es gilt, zB Referenz:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Dann kopieren und den gesamten ItemGroup Tag einfügen und bearbeiten sie die Details Ihrer 64-Bit-DLL enthalten, zB:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
nach dem proje Nachladen In VS.NET wird das Assembly-Referenzdialogfeld durch diese Änderungen etwas verwirrt, und Sie können einige Warnungen über Assemblys mit dem falschen Zielprozessor erhalten, aber alle Ihre Builds funktionieren einwandfrei.
die MSI-Ausgabe zu lösen, ist weiter nach oben, und leider wird benötigt ein non-VS.NET Werkzeug: Ich ziehe es Advanced Installer die Caphyon für diesen Zweck, da es den grundlegenden Trick beteiligt (Schaffung eines gemeinsamen MSI zieht ab, wie sowie 32-Bit und 64-Bit spezifische MSIs, und verwenden Sie ein .EXE-Setup-Launcher, um die richtige Version zu extrahieren und die erforderlichen Korrekturen zur Laufzeit durchzuführen) sehr, sehr gut.
Sie können wahrscheinlich die gleichen Ergebnisse mit anderen Tools oder der Windows Installer XML (WiX) toolset erreichen, aber Advanced Installer macht die Dinge so einfach (und ist ziemlich erschwinglich), dass ich nie wirklich auf Alternativen geschaut habe.
Eine Sache, die Sie Mai immer noch benötigen WiX für obwohl, selbst wenn Sie Advanced Installer verwenden, ist für Ihre .NET Installer Class benutzerdefinierte Aktionen.Es ist zwar trivial, bestimmte Aktionen anzugeben, die nur auf bestimmten Plattformen ausgeführt werden sollten (unter Verwendung der Ausführungsbedingungen VersionNT64 und NOT VersionNT64). Die integrierten benutzerdefinierten AI-Aktionen werden jedoch auch auf 64-Bit-Computern mit dem 32-Bit-Framework ausgeführt .
Dies kann in einer zukünftigen Version behoben werden, aber vorerst (oder wenn Sie ein anderes Tool zum Erstellen Ihrer MSIs mit demselben Problem verwenden) können Sie die verwaltete benutzerdefinierte Aktion von WiX 3.0 verwenden, um Aktions-DLLs mit zu erstellen die richtige Bitness, die mit dem entsprechenden Framework ausgeführt wird.
Bearbeiten: ab Version 8.1.2 unterstützt Advanced Installer 64-Bit-benutzerdefinierte Aktionen ordnungsgemäß. Seit meiner ersten Antwort hat ihr Preis erhöht ziemlich viel, leider, obwohl es immer noch ein sehr guter Preis ist im Vergleich zu Installshield und seinen ilk ...
Edit: Wenn Sie Ihre DLLs im GAC registriert sind, Sie können auch die Standard-Referenz-Tags auf diese Weise (SQLite als Beispiel) verwenden:
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
die Bedingung auch für alle nach unten reduziert bauen Typen, Freigabe oder debuggen und gibt nur die Prozessorarchitektur.
@Magnus Johansson: Sie zwei Konfigurationen verwenden können, die Hälfte Ihr Ziel zu erreichen. Das MSI ist ein bisschen schwieriger. – user7116