我正在处理系统托盘应用程序,该应用程序很可能会在未来频繁更新。为此,我们的用户希望安装程序在尝试安装之前找到并终止应用程序进程。
这是我在安装后启动流程并在安装之前终止它的自定义操作的类。
public InstallerActions( ) : base( ) {
System.Diagnostics.Debugger.Launch( );
this.BeforeInstall += ( S, E ) => {
System.Diagnostics.Debugger.Break( );
/*IPC Process Termination Method Goes Here*/
};
this.Committed += ( S, E ) => {
System.Diagnostics.Debugger.Break( );
try {
Directory.SetCurrentDirectory( Path.GetDirectoryName( Assembly.GetExecutingAssembly( ).Location ) );
Process.Start( Path.GetDirectoryName( Assembly.GetExecutingAssembly( ).Location ) + @"\Program.exe" );
} catch { return; } //Return on failure.
};
}
它不起作用。
我知道有安装,提交,回滚和卸载自定义操作,在我尝试使用它们之前,我也没有成功。 此类包含在应用程序的主程序集中,该程序集已添加到我的“安装和部署”项目的“自定义操作”部分中...但这就是我所做的一切。我需要做些什么才能让这些行为被调用?我甚至将VS调试器连接到安装程序,但我发现该类甚至没有被调用(或者,至少,断点在类代码中不会变为活动状态我说它没有加载。)
我该如何做到这一点?
对于Clarity,请求设置项目的类型。这是VS 2013安装和部署项目类型:
查看突出显示的项目类型。
很抱歉不清楚。
我一直建议IPC> Process.Kill( )
,所以我将探索这种方法;然而,主要问题仍然存在:如果没有调用Process.Kill( )
,则不会调用任何其他需要调用的方法。
根据我发现的this链接,似乎可以调用自定义动作 - 但是在一个为我做任何好事的时候已经太晚了。我没有提到我已经在后台运行的另一个有问题的程序实例运行此测试,并且已经收到通知说安装因为正在运行的程序而无法继续运行。因此,这有助于我理解行动失败的原因是因为它们从未被发现过;安装程序无法终止程序,因为程序会停止安装程序进入命令以终止程序,因为Catch 22。
所以这个问题仍然有效,但现在我不得不问 - 是否有可能,例如,当程序安装程序首次运行时,终止进程,或者只是用户必须做的事情手动?
鉴于我现在所知道的,我被迫从VS设置项目切换到WIX ......我甚至不知道WIX超出了其他一些设置...工具......的事情。请继续关注未来的发展......
答案 0 :(得分:4)
杀死一个进程并不是一个好主意。该过程可能正在将一些数据保存到可能被中断的文件中。此外,请注意,可能还有其他具有相同名称的进程正在查杀 - 它不一定是您的。这可能会导致严重的数据丢失。
尝试进行进程间通信,例如命名管道,已知目录中的某个文件等。
在.NET中,您可能想尝试IpcChannel类。