Sí, puede orientar tanto x86 y x64 con la misma base de código en el mismo proyecto. En general, las cosas solo funcionarán si crea las configuraciones de solución correctas en VS.NET (aunque P/Invoke a DLL totalmente no administradas probablemente requerirá algún código condicional): los elementos que encuentro que requieren atención especial son:
- las referencias a los ensamblados administrados fuera con el mismo nombre pero su propio valor de bits específica (esto también se aplica a los ensamblados de interoperabilidad COM)
- el paquete MSI (que, como ya se ha señalado, tendrá que dirigirse a x86 o x64)
- Cualquier instalador .NET personalizado Acciones basadas en clase en su paquete MSI
El problema de referencia de ensamblaje no se puede resolver completamente en VS.NET, ya que solo le permitirá agregar una referencia con un nombre dado a un proyecto una vez. Para evitar esto, edite su archivo de proyecto manualmente (en VS, haga clic con el botón derecho en su archivo de proyecto en el Explorador de soluciones, seleccione Descargar proyecto, luego haga clic con el botón secundario y seleccione Editar). Después de añadir una referencia a, por ejemplo, la versión x86 de un montaje, el archivo de proyecto contendrá algo como:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Wrap que hacen referencia a la etiqueta dentro de una etiqueta ItemGroup que indica la configuración de la solución que se aplica, por ejemplo:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
a continuación, copiar y pegar la etiqueta completa ItemGroup, y editarla para contener los detalles de su DLL de 64 bits, por ejemplo:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Después de cargar de nuevo el proje ct en VS.NET, el cuadro de diálogo Referencia de ensamblado se verá un poco confundido por estos cambios, y es posible que encuentre algunas advertencias sobre ensamblajes con el procesador de destino incorrecto, pero todas sus compilaciones funcionarán correctamente.
Resolver el problema de MSI es el siguiente, y por desgracia este se requerir una herramienta non-VS.NET: Prefiero Caphyon de Advanced Installer para tal fin, ya que se quita el truco básico implicado (crear un MSI común, así como los MSI específicos de 32 y 64 bits, y usan un iniciador de instalación .EXE para extraer la versión correcta y realizar las correcciones necesarias en el tiempo de ejecución) muy, muy bien.
Probablemente pueda lograr los mismos resultados usando otras herramientas o el Windows Installer XML (WiX) toolset, pero el Instalador avanzado hace las cosas tan fáciles (y es bastante asequible) que nunca he visto alternativas.
Una cosa es que
puede seguir requiriendo WiX aunque, incluso cuando se usa Advanced Installer, es para sus acciones personalizadas de la clase de instalador .NET.Aunque es trivial especificar ciertas acciones que solo deberían ejecutarse en ciertas plataformas (utilizando las condiciones de ejecución VersionNT64 y NO VersionNT64, respectivamente), las acciones personalizadas de AI incorporadas se ejecutarán utilizando el Framework de 32 bits, incluso en máquinas de 64 bits. .
Esto se puede arreglar en una versión futura, pero por ahora (o cuando usa una herramienta diferente para crear sus MSI que tienen el mismo problema), puede usar el soporte de acción personalizado administrado de WiX 3.0 para crear archivos DLL de acción la bitness adecuada que se ejecutará utilizando el Marco correspondiente.
Editar: a partir de la versión 8.1.2, el instalador avanzado admite correctamente las acciones personalizadas de 64 bits. Desde mi respuesta original, su precio ha aumentado un poco, por desgracia, a pesar de que sigue siendo un valor muy bueno en comparación con InstallShield y su calaña ...
Editar: Si sus DLL se registran en la GAC, también puede utilizar las etiquetas estándar de referencia de esta manera (SQLite como ejemplo):
<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>
la condición también se reduce a construir todo tipo, liberación o de depuración, y simplemente especifica la arquitectura del procesador.
@Magnus Johansson: se pueden utilizar dos configuraciones para lograr la mitad de su meta. El MSI es un poco más difícil. – user7116