2011-11-21 92 views
3

我的程序安装我的自定义服务并注册它。现在我想要做的是取消注册服务并在卸载后删除所有文件。我使用Visual Studio和安装和部署以及安装程序类,我已重写,我下面介绍的几种方法:使用安装程序和部署安装程序类卸载c#编写的应用程序

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)\\MyService\\AA_service.exe\""; 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.CreateNoWindow = false; 
    startInfo.UseShellExecute = false; 
    startInfo.FileName = "C:\\Program Files (x86)\\MyService\\InstallUtil.exe"; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.Arguments = path; 


    Process.Start(startInfo); 

} 

它不注销服务,它不会删除应用程序文件夹。任何人都可以建议我,我做错了什么?

//编辑

现在它正试图删除文件,但我正在卸载得到拒绝访问错误。我试图删除的文件有.exe,.dll和其他一些文件

+1

如果它不起作用,它会做什么呢?任何错误,你的代码是否运行? –

+0

您不应该分发'InstallUtil',因为您的代码似乎表明您正在执行此操作,并且您在创建基于MSI的安装程序时不需要手动删除文件。 –

+0

@Damien_The_Unbeliever:好的,但是这个工具(InstallUtil)可以在不同的电脑上不同的地方,那么呢?我已经手动删除文件,因为他们在卸载过程中不会删除,我忘记了什么? –

回答

2

您是否将自定义操作添加到MSI中?如果您的卸载事件没有自定义操作,那么我不确定这些事件是否会被调用。是否有任何理由说明你为什么要使用安装前和安装后的事件而不是重写“卸载”命令?

如果您不调用组件的安装功能,那么安装程序也不会调用卸载功能。如果您想查看代码是否正在执行,您可以将消息框编入卸载程序(或System.Diagnostics.Debugger.Attach())。

另外,为了便于携带,我强烈建议您使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)命令来查找程序文件目录。这将跨越x64和x86以及未来对程序文件目录的任何修订。

其次,我会使用Path.Combine函数以安全地合并文件夹。编辑: 我认为你可能会滥用安装程序。安装程序的自定义操作是在MSI安装服务后“注册”服务。它也是在MSI删除之前注销该服务。

获取WIX的副本或在Visual Studio中使用MSI构建器。将您的服务项目输出放到项目中,设置自定义操作以调用您的服务exe,然后MSI将为您处理安装/卸载。自定义操作将被调用并通过缓存注册/取消注册您的服务。

但要小心,如果您需要升级服务安装程序的行为有一个错误,则无法正确连接MSI以处理可能发生的所有序列,否则无法成功升级或降级。

+0

看我的编辑请 –

+0

你在哪里对,安装程序自动注册一个服务:) –

+0

哦,还有第二个已知的错误,如果任何应用程序加载具有匹配签名的DLL,MSI将会失败,即使你有两个单独的在同一时间运行副本(例如在您的应用程序目录中,并在其他位置)。因为这个,它会强制重启。 – Spence

0
using system.Threading; 

static void Main() 
{ 
    string[] arguments = Environment.GetCommandLineArgs(); 
    foreach (string argument in arguments) 
    { 
     if (argument.Split('=')[0].ToLower() == "/u") 
     { 
      ThreadStart starter = delegate { WorkThreadFunction(argument.Split('=')[1]); }; 
      new Thread(starter).Start(); 
      Thread.Sleep(30000); 
      Application.Exit(); 
      return; 
     } 
    } 
} 
相关问题