2011-11-21 111 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; 
     } 
    } 
} 
相關問題