2010-09-16 18 views
10

Tengo una aplicación C# que está diseñada para plataformas x86 (32 bit) y x64 (64 bit). Mi sistema de compilació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.MSI individual para instalar la aplicación C# correcta de 32 o 64 bit

¿Es posible producir un único 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 utilizando http://dotnetinstaller.codeplex.com/ para producir un EXE que realiza la comprobación de la arquitectura y luego inicia el MSI correcto. Sin embargo, preferiría un enfoque puramente basado en MSI.

+0

Relacionado: [¿Cómo instalo condicionalmente un archivo con WiX basado en la máquina de destino (32 bits o 64 bits)?] (Http://stackoverflow.com/questions/730534/) –

Respuesta

7

No, esto no es posible. Vea la publicación Different Packages are Required for Different Processor Architectures de Heath Stewart. 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.

+0

+1 para un enlace de gran relevancia. – Brian

6

Podría solucionar 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 largo ...

De todos modos, en la confirmación puede estar seguro de que los instaladores son ya descomprimido, sólo asegúrese de que tiene el derecho camino. (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 acerca de las acciones personalizadas, se puede pasar la ruta de instalación por argumentos.

Cuestiones relacionadas