C# 如何从控制台应用程序运行InstallScript项目
我已经创建了一个主要升级(Installscript msi),通过单击exe文件执行时,该升级运行良好 我还创建了一个控制台应用程序,它运行相同的exe,但这次安装后,与新版本一起,以前的版本显示在“添加/删除程序”列表中 所有组件均已正确安装,但 为什么以前的版本只在我从控制台运行exe应用程序时显示C# 如何从控制台应用程序运行InstallScript项目,c#,console-application,installshield,installscript,installscript-msi,C#,Console Application,Installshield,Installscript,Installscript Msi,我已经创建了一个主要升级(Installscript msi),通过单击exe文件执行时,该升级运行良好 我还创建了一个控制台应用程序,它运行相同的exe,但这次安装后,与新版本一起,以前的版本显示在“添加/删除程序”列表中 所有组件均已正确安装,但 为什么以前的版本只在我从控制台运行exe应用程序时显示 // Enter the executable to run, including the complete path start.FileName = @"folder1\MyISProj.
// Enter the executable to run, including the complete path
start.FileName = @"folder1\MyISProj.exe";
// Do you want to show a console window?
start.CreateNoWindow = true;
start.WindowStyle = ProcessWindowStyle.Minimized;
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
// Run the external process & wait for it to finish
using (Process proc = Process.Start(start))
{
//proc.WaitForExit();
proc.Close();
}
我观察到的另一件事是,当我从控制台应用程序调用exe时,安装程序将打开,在接受EULA等之后,当实际安装开始时,控制台应用程序将再次被调用。为了停止这种行为,我添加了一个checkinmain方法,只运行控制台应用程序一次。现在,当安装程序再次尝试运行控制台应用程序时,它将检查进程是否已经在运行,如果是,它将从控制台应用程序返回
Process[] result = Process.GetProcesses();
foreach (var item in result)
{
if (item.ProcessName.Contains("MyISProj"))
{
Console.WriteLine("There is already a instance running.");
System.Environment.Exit(0);
return;
}
}
但执行此操作后,添加/删除程序列表也会显示两个条目。
我要怎么做才能解决这个问题?我被这个问题困住了
我正在使用InstallShield 2011专业版创建exe。这里有两个问题。首先,您没有有效的主要升级,添加/删除程序中的两个条目证明了这一点。您已经更改了ProductCode,但升级表条目(由FindRelatedProducts和RemoveExistingProducts执行)未检测到以前的安装并将其作为升级的一部分删除。从谷歌搜索中可以找到许多原因 第二个问题是InstallScript MSI静默安装是一个令人头疼的问题。它们要求您生成一个响应文件,然后使用它运行。这是非常脆弱的,也是我建议继续使用基本MSI的一个重要原因,这是一个更简单的故事。(msiexec/I foo.msi/qn REBOOT=R并检查3010退出代码,表明需要并禁止重新启动。)MsiGetProperty(ISMSI_句柄,“ISACTIONPROP1”,szOldProductValue,nProSize);正在返回以前的现有产品代码。当我点击执行“exe”时,它工作正常,但当我从控制台应用程序运行相同的exe时,问题就出现了。我的不是无声安装。我只是调用代码中显示的exe。它是exe而不是msi,因此我无法使用MSIEXC。