在安装过程中启动Msiexec的自定义操作

时间:2015-05-26 20:59:27

标签: c# installer action

我完成了我的软件,但我无法找到正确的方法来创建它的设置。

我在网上搜索了一下,但我发现只有旧帖子引用旧的视觉工作室版本。

据我所知,在VS 2013社区版中,我有一个有限的Installshield插件,我也可以下载Visual Studio Installer插件。创建一个简单的设置相对容易,但我需要在安装过程中静默安装一个小软件。该软件是Double Agent(Microsoft Agent的更新版本),开发人员建议以这种方式启动设置:

简单地运行:

msiexec /i DoubleAgent_x86.msi /qb-!

在你的设置过程中(我认为最好的地方应该是Commit事件)。

顺便说一下,无法通过动作启动.msi安装程序,我真的不了解创建自定义操作的最佳做​​法。

我读了一些关于创建类的内容,但大多数文章都引用了Visual Studio 2008或Wix插件。我正在寻找一种方法来使用Msiexec和Visual Studio Installer或installshield。

编辑:我找到了这个解决方案并且效果很好:https://msdn.microsoft.com/it-it/library/vstudio/d9k65z2d%28v=vs.100%29.aspx

它是意大利语,但使用右上角的单选按钮很容易翻译成原始语言(英语)。它与Visual Studio安装程序插件和VS社区版2013完美配合。

我目前没有可以发布的代码,因为我只构建了他们的样本,但我会尽快发布它,并使用msiexec进行隐藏安装。

我创建了一个测试winform项目,我使用以下代码添加了安装程序类:

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            // Use ProcessStartInfo class
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = false;
            startInfo.FileName = "msiexec.exe";
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = "/i DoubleAgent.msi /qb-!";

            try
            {
                // Start the process with the info we specified.
                // Call WaitForExit and then the using statement will close.
                using (Process exeProcess = Process.Start(startInfo))
                {
                    exeProcess.WaitForExit();
                }
            }
            catch
            {
                // Log error.
            }
        }

我使用Visual Studio安装程序创建了设置。在主要设置结束时,有些东西开始说有另一个安装,但双重代理没有安装。

再次编辑:我没有管理员权限静默执行msiexec。我认为因为Double Agent设置需要管理员权限。我不想使用manifest来提升权限然后我认为唯一的解决方案是显示DoubleAgent安装程序(如果在最小输出中也是如此)。

顺便说一句,我将此代码用于表单1按钮:

private void button1_Click(object sender, EventArgs e)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;
    startInfo.UseShellExecute = false;
    startInfo.FileName = "msiexec.exe";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = "/i DoubleAgent.msi /qn";

    try
    {
        // Start the process with the info we specified.
        // Call WaitForExit and then the using statement will close.
        using (Process exeProcess = Process.Start(startInfo))
        {
            exeProcess.WaitForExit();
            MessageBox.Show("Finish");
        }
    }
    catch
    {
        // Log error.
    }
}

但是在安装过程中相同的代码不起作用。

1 个答案:

答案 0 :(得分:0)

这不会起作用!一个MSI设置无法启动另一个MSI设置。当它说"另一个安装正在进行时#34;它指的是你已经在运行的那个。它与管理员权限无关 - 无论开发人员说什么,您都无法从安装程序自定义操作安装另一个MSI。

通常,这是bootstrappers的用途,用于在安装主MSI之前安装先决条件。这就是为什么即使是VS设置也允许您在安装MSI之前生成setup.exe以安装必备软件(其中许多是基于MSI的)。

因此,您需要找出一个将安装该MSI的引导程序(不知道InstallShield LE是否有一个引导程序)。曾经有一个名为Bootstrap Manifest Generator的工具,您可以使用该工具来定制setup.exe来安装像您这样的自定义先决条件。或者您可以使用WiX的引导程序来安装MSI,然后安装MSI。或者您可以将该MSI复制到系统并让您的应用程序在第一次使用时安装它。

或许代理软件可用作合并模块,在这种情况下,您只需将合并模块添加到MSI构建中。