Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单个MSI安装正确的32或64位c#应用程序_C#_Windows_Windows Installer_32bit 64bit - Fatal编程技术网

单个MSI安装正确的32或64位c#应用程序

单个MSI安装正确的32或64位c#应用程序,c#,windows,windows-installer,32bit-64bit,C#,Windows,Windows Installer,32bit 64bit,我有一个C#应用程序,它是为x86(32位)和x64(64位)平台构建的。我的构建系统目前输出两个MSI安装程序,每个平台一个。如果有区别,我的C#应用程序包含一个windows任务栏工具栏,这意味着安装的DLL必须由explorer.exe进程加载 根据当前操作系统是否为64位操作系统,是否可以生成一个MSI安装程序来安装正确版本的应用程序 目前,这是通过使用生成一个执行架构检查的EXE,然后启动正确的MSI来实现的。但是,我更喜欢纯粹基于MSI的方法。不,这是不可能的。见希思·斯图尔特的帖子

我有一个C#应用程序,它是为x86(32位)和x64(64位)平台构建的。我的构建系统目前输出两个MSI安装程序,每个平台一个。如果有区别,我的C#应用程序包含一个windows任务栏工具栏,这意味着安装的DLL必须由explorer.exe进程加载

根据当前操作系统是否为64位操作系统,是否可以生成一个MSI安装程序来安装正确版本的应用程序


目前,这是通过使用生成一个执行架构检查的EXE,然后启动正确的MSI来实现的。但是,我更喜欢纯粹基于MSI的方法。

不,这是不可能的。见希思·斯图尔特的帖子。使用MSI处理此问题的唯一方法是按照您描述的方式使用引导。如果您只需要在64位位置放置一个或两个文件或密钥,可以(但不推荐)在自定义操作中这样做,但更改目标安装位置和使用内置MSI文件支持将不起作用。

您可以解决此问题。将2个安装程序打包到第三个部署项目下。创建一个检查正在运行的OS版本的自定义操作,然后让安装程序调用正确的安装程序

大概是这样的:

[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;
}
好吧,那太长了

无论如何,在提交中,您可以确保安装程序已经解包,只需确保您有正确的路径即可。(您可以将cmd命令从/c更改为/k进行测试,这将使命令提示符窗口保持活动状态,以便查看消息)

您可以阅读有关自定义操作的更多信息,安装路径可以通过参数传递。

相关: