2010-09-16 4 views
10

Ho un'applicazione C# che è stata creata per entrambe le piattaforme x86 (32 bit) e x64 (64 bit). Il mio sistema di build attualmente produce due programmi di installazione MSI, uno per ogni piattaforma. Nel caso in cui faccia la differenza, la mia applicazione C# include una barra degli strumenti della barra delle applicazioni di Windows, il che significa che la DLL installata deve essere caricata dal processo explorer.exe.MSI singolo per installare l'applicazione C# 32 o 64 bit corretta

È possibile produrre un singolo programma di installazione MSI che installerà la versione corretta della mia applicazione a seconda che il SO corrente sia un SO a 64 bit?

Questo è stato attualmente raggiunto utilizzando http://dotnetinstaller.codeplex.com/ per produrre un EXE che esegue il controllo dell'architettura e quindi avvia l'MSI corretto. Tuttavia, preferirei un approccio puramente MSI.

+0

Correlati: [Come installo condizionatamente un file con WiX basato sul computer di destinazione (32 bit o 64 bit)?] (Http://stackoverflow.com/questions/730534/) –

risposta

7

No, questo non è possibile. Vedi il post di Heath Stewart Different Packages are Required for Different Processor Architectures. L'unico modo per gestirlo con MSI è con un bootstrap sulla falsariga di ciò che descrivi. Se hai solo bisogno di mettere un file o una chiave o due in una posizione a 64 bit, è possibile (ma non consigliato) farlo in un'azione personalizzata, ma cambiando il percorso di installazione di destinazione e utilizzando il supporto del file MSI integrato ha vinto ' lavoro.

+0

+1 per il collegamento altamente pertinente. – Brian

6

Si potrebbe aggirare il problema. Imballare i 2 programmi di installazione nel terzo progetto di distribuzione. Creare un'azione personalizzata che controlli la versione del sistema operativo in esecuzione, quindi fare in modo che il programma di installazione chiami il programma di installazione corretto.

Qualcosa di simile a questo:

[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, che è stato a lungo ...

In ogni caso, nel Commit si può essere sicuri che gli installatori siano già scompattato, basta assicurarsi di avere il diritto sentiero. (È possibile modificare il comando cmd da/c a/k per i test, che manterrà attiva la finestra del prompt dei comandi per visualizzare i messaggi)

È possibile leggere ulteriori informazioni sulle azioni personalizzate, il percorso di installazione può essere superato da argomenti.