MSI individual para instalar la aplicación c # correcta de 32 o 64 bit

Tengo una aplicación C # que está diseñada para plataformas x86 (32 bit) y x64 (64 bit). Mi sistema de comstackción actualmente genera dos instaladores MSI, uno para cada plataforma. En caso de que haga una diferencia, mi aplicación C # incluye una barra de herramientas de la barra de tareas de Windows, lo que significa que la DLL instalada debe ser cargada por el proceso explorer.exe.

¿Es posible producir un solo instalador de MSI que instalará la versión correcta de mi aplicación dependiendo de si el sistema operativo actual es un sistema operativo de 64 bits?

Esto se ha logrado actualmente al usar http://dotnetinstaller.codeplex.com/ para producir un EXE que realiza la comprobación de architecture y luego inicia el MSI correcto. Sin embargo, preferiría un enfoque puramente basado en MSI.

No, esto no es posible Ver los diferentes paquetes de Heath Stewart son necesarios para la publicación de diferentes architectures de procesador . La única forma de manejar esto con MSI es con un bootstrap en la línea de lo que describes. Si solo necesitara colocar un archivo o clave o dos en una ubicación de 64 bits, es posible (pero no recomendado) hacer eso en una acción personalizada, pero cambiar la ubicación de instalación de destino y usar el soporte de archivos MSI incorporado ganó t trabajo.

Podrías evitar el problema. Empaque 2 instaladores en el tercer proyecto de implementación. Cree una acción personalizada que verifique la versión del sistema operativo en ejecución, luego haga que el instalador llame al instalador correcto.

Algo como esto:

[RunInstaller(true)] public partial class MyInstaller: Installer { String installerPath; public MyInstaller() { InitializeComponent(); if (Is64Bit())//running as 64-bit { installerPath= @"installfolder\my64bitsetup.exe"; } else { installerPath= @"installfolder\my32bitsetup.exe"; } } [SecurityPermission(SecurityAction.Demand)] public override void Install(IDictionary stateSaver) { base.Install(stateSaver); } [SecurityPermission(SecurityAction.Demand)] public override void Commit(IDictionary savedState) { base.Commit(savedState); MyInstall(); } [SecurityPermission(SecurityAction.Demand)] public override void Rollback(IDictionary savedState) { base.Rollback(savedState); } [SecurityPermission(SecurityAction.Demand)] public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); base.Commit(savedState); } private void MyInstall() { ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd.exe", "/c " + installerPath); RunProcess(procStartInfo); } private void RunProcess(ProcessStartInfo procStartInfo) { Process proc = new Process(); proc.StartInfo = procStartInfo; proc.Start(); proc.WaitForExit(); } [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo); private bool Is64Bit() { return (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor())); } private bool Is32BitProcessOn64BitProcessor() { bool retVal; IsWow64Process(Process.GetCurrentProcess().Handle, out retVal); return retVal; } 

Ok, eso fue mucho …

De todos modos, en Commit puedes estar seguro de que los instaladores ya están desempaquetados, solo asegúrate de tener la ruta correcta. (Puede cambiar el comando cmd de / c a / k para las pruebas, que mantendrá activa la ventana del símbolo del sistema para que pueda ver los mensajes)

Puede leer más sobre acciones personalizadas, la ruta de instalación se puede pasar por argumentos.