我完成了我的软件,但我无法找到正确的方法来创建它的设置。
我在网上搜索了一下,但我发现只有旧帖子引用旧的视觉工作室版本。
据我所知,在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.
}
}
但是在安装过程中相同的代码不起作用。
答案 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构建中。