我有一个为x86(32位)和x64(64位)平台构build的C#应用程序。 我的构build系统目前输出两个MSI安装程序,每个平台一个。 如果它有所作为,我的C#应用程序包含一个Windows任务栏工具栏,这意味着安装的DLL必须由explorer.exe进程加载。
是否有可能生成一个单一的MSI安装程序,将安装我的应用程序的正确版本取决于当前的操作系统是否是一个64位的操作系统?
目前已经通过使用http://dotnetinstaller.codeplex.com/产生一个执行体系结构检查然后启动正确的MSI的EXE来实现。 不过,我更喜欢纯粹基于MSI的方法。
不,这是不可能的。 请参阅Heath Stewart的不同软件包对不同处理器体系结构的要求。 用MSI来处理这个问题的唯一方法就是根据你所描述的方法进行引导。 如果您只需要在64位位置放置文件或密钥,可以(但不建议)在自定义操作中执行该操作,但是更改目标安装位置并使用内置MSI文件支持会赢得“工作。
你可以解决这个问题。 在第三个部署项目下打包2个安装程序。 创建一个自定义操作来检查正在运行的操作系统版本,然后使安装程序调用正确的安装程序。
像这样的东西:
[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; }
好吧,那很长…
无论如何,在Commit中,您可以确定安装程序已经解压缩,只要确保您有正确的路径即可。 (您可以将cmd命令从/ c更改为/ k以进行测试,这将使命令提示符窗口保持活动状态,以便您看到消息)
您可以阅读更多关于自定义操作的信息,安装路径可以通过参数传递。