С#: Directory.getCurrentDirectory() при запуске из браузера

В настоящее время я работаю над Autoupdater для своих приложений. (в сочетании с установщиком, средством обновления и средством удаления)

Я хотел бы настроить все вещи автоматически:

  • Вход в начальное меню
  • Папка в C:\Program Files\
  • Папка конфигурации в данных приложения (в зависимости от роуминга/локальности)
  • Удаление программного обеспечения - запись в "Программы и компоненты"
  • Ярлык рабочего стола.

Все это работает очень хорошо. Для записи в Program Files и реестр инструменту требуются права администратора ofc. Поэтому я добавил «перезапуск» AppLauncher после того, как выбрано нужное программное обеспечение. Просто что-то вроде этого:

ProcessStartInfo pi = new ProcessStartInfo(Directory.GetCurrentDirectory() + @"\AppLauncher.exe");
        pi.Verb = "runas";
        pi.Arguments = "install " + this.appItem.APID;

        Process p = new Process();
        p.StartInfo = pi;
        try
        {
            p.Start();
            Application application = Application.Current;
            application.Shutdown();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unable to install the application.\n\n" + ex.ToString(), "Error", 
            application.Shutdown();
        }

Также этот шаг работает очень хорошо, если пользователь сохраняет AppLauncher.exe где-то в папке и запускает его, дважды щелкнув по нему.

Если пользователь решает нажать «Выполнить» в браузере, установщик сталкивается с показанным исключением, сообщая, что «AppLauncher.exe» не найден. Я предполагаю, что запуск файла прямо из браузера приведет к настройке другого рабочего каталога и, следовательно,

Directory.GetCurrentDirectory()

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

Итак, что я могу сделать по этому поводу?

Есть ли что-то вроде File.GetCurrentFile(): P


person dognose    schedule 03.07.2012    source источник
comment
см.: stackoverflow.com/questions/218061/get-the-applications- путь   -  person ctrl-alt-delor    schedule 03.07.2012


Ответы (1)


Заменять

Directory.GetCurrentDirectory() + @"\AppLauncher.exe"

с участием

System.Reflection.Assembly.GetEntryAssembly().Location

(если вы

Однако лучше не изобретать велосипед, а воспользоваться одним из доступных инсталляторов, в котором уже реализованы все возможности интеграции и исправлены все ошибки.

Например: ClickOnce, WiX.

person penartur    schedule 03.07.2012
comment
Не слишком ли для этой цели использовать Reflection? - person Alex; 03.07.2012
comment
Он встроен в .NET, поэтому я сомневаюсь, что это как-то повлияет на производительность. OP хочет получить путь к выполняемой в данный момент программе; для этого и предназначался GetEntryAssembly(). PS: Если посмотреть на вопрос более внимательно, это именно то, что ищет ОП (File.GetCurrentFile()). - person penartur; 03.07.2012
comment
На самом деле сборка, содержащая исполняемый в данный момент код, извлекается через System.Reflection.Assembly.GetExecutingAssembly() - person Alex; 03.07.2012
comment
@Alex OP хочет знать путь к своему AppLauncher.exe, а не к .dll, который содержит исполняемый в данный момент код. - person penartur; 03.07.2012
comment
+1, потому что это правильно и за предложение не изобретать велосипед :) - person Maghis; 03.07.2012
comment
Большое спасибо. Попробую это немедленно. Я знаю, что есть много установщиков. Но поскольку я использую самодельный dll-фреймворк, который используется всеми моими приложениями (находится в файлах программы/имя/common, а не в файлах программы/имя/certainApp), ни один установщик не соответствует моим требованиям. - person dognose; 03.07.2012
comment
Работает как шарм :0) - Спасибо. - person dognose; 03.07.2012