Удаление приложения, написанного на c #, с использованием установки и развертывания и класса установщика - PullRequest
4 голосов
/ 21 ноября 2011

моя программа устанавливает мой пользовательский сервис и регистрирует его. Теперь я пытаюсь отменить регистрацию сервиса и удалить все файлы после удаления. Я использую Visual Studio, программу установки и развертывания, а также класс установщика. Я переопределил несколько методов, которые я представляю ниже:

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 и некоторые другие

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Вы добавили пользовательские действия в MSI? Если у вас нет настроенного действия для события удаления, я не уверен, будут ли вызваны эти события. Есть ли какая-либо причина, по которой вы используете события до и после установки вместо переопределения команды «удалить»?

Если вы не вызываете функцию установки для компонента, то установщик также не будет вызывать функцию удаления. Вы можете запрограммировать окно сообщения в деинсталляции (или System.Diagnostics.Debugger.Attach()), если хотите посмотреть, выполняется код или нет.

Также для переносимости я настоятельно рекомендую использовать команду Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) для поиска каталога программных файлов. Это будет портировать через x64 и x86, а также любые будущие изменения в каталоге программных файлов в будущем.

Во-вторых, я бы также использовал функцию Path.Combine для безопасного объединения папок.

EDIT: Я думаю, что вы, возможно, неправильно используете процедуру установки. Пользовательское действие установщика заключается в том, чтобы «зарегистрировать» службу после ее установки MSI. Также необходимо отменить регистрацию службы перед ее удалением MSI.

Получите копию WIX или используйте MSI Builder в Visual Studio. Перенесите выходные данные проекта для вашего сервиса в проект, настройте настраиваемые действия для вызова вашего exe сервиса, и затем MSI выполнит установку / удаление для вас. Будет вызвано пользовательское действие и зарегистрируйте / отмените регистрацию вашей службы в кэше.

Будьте очень осторожны, хотя, если вам нужно обновить, есть ошибка в поведении установщика службы, он не сможет успешно обновить или понизить версию без правильного подключения MSI для обработки всех возможных последовательностей.

0 голосов
/ 20 марта 2012
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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...