使用安装和部署以及Installer类卸载用c#编写的应用程序
我的程序安装我的自定义服务并注册它.现在我要做的是取消注册服务并在卸载后删除所有文件.我正在使用Visual Studio和Setup and Deployment以及Installer类,我已经覆盖了下面介绍的一些方法:
protected override void OnAfterUninstall(IDictionary savedState) { base.OnAfterUninstall(savedState); string directory = "C:Program Files (x86)MyService"; if (System.IO.Directory.Exists(directory)) { string[] files = System.IO.Directory.GetFiles(directory); foreach (string file in files) { System.IO.File.Delete(file); } System.IO.Directory.Delete(directory); } } protected override void OnBeforeUninstall(IDictionary savedState) { base.OnBeforeUninstall(savedState); string path = "-u "C:Program Files (x86)MyServiceAA_service.exe""; ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = false; startInfo.UseShellExecute = false; startInfo.FileName = "C:Program Files (x86)MyServiceInstallUtil.exe"; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = path; Process.Start(startInfo); } 它不会取消注册服务,也不会删除应用程序文件夹.谁能告诉我我做错了什么? //编辑 现在它正在尝试删除文件,但我在卸载时遇到访问被拒绝错误.我想删除的文件是.exe,.dll和其他一些文件 解决方法
您是否将自定义操作添加到MSI中?如果您的卸载事件没有自定义操作,那么我不确定是否会调用这些事件.您是否有任何理由使用之前和之后的安装事件而不是覆盖“uninstall”命令?
如果不调用组件的Install功能,则安装程序也不会调用卸载功能.如果要查看代码是否正在执行,可以将消息框编程到卸载程序(或System.Diagnostics.Debugger.Attach())中. 另外,作为可移植性问题,我强烈建议您使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)命令查找程序文件目录.这将跨越x64和x86,以及将来对程序文件目录的任何修订. 其次,我也会使用Path.Combine函数将文件夹安全地合并在一起. 编辑: 获取WIX的副本或在Visual Studio中使用MSI构建器.将服务的项目输出删除到项目中,设置自定义操作以调用服务exe,然后MSI将为您处理安装/卸载.将调用自定义操作并使用缓存注册/取消注册您的服务. 但要非常小心,如果您需要升级,那么服务安装程序的行为就会出现错误,如果没有正确连接MSI以处理可能发生的所有序列,则无法成功升级或降级. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |