Установите, что программа должна запускаться при запуске из установщика - PullRequest
13 голосов
/ 23 февраля 2011

У меня есть приложение на C # .net 4, я начинаю создавать установщик.

Установленная программа работает нормально, но мой клиент хочет, чтобы приложение запускалось с помощью окна (это панель инструментов «Всегда сверху», которая помогает им управлять вызовами).

Я подумал создать «Class Installer» и вставить в него ключ в реестре.

У меня две проблемы:

Первое: как мне найти путь к исполняемому файлу? Это может измениться между установкой. Я где-то нашел Application.ExecutablePath, но, похоже, он находится в Application.Window.Forms, поэтому я думаю, что он не совместим с WPF

Второе: мне нужно вставить этот ключ в реестр локальной машины. Есть ли способ в установщике Windows, чтобы указать, что пользователь должен иметь права администратора?

Вот код, который я начал:

RegistryKey rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("CstStart", ???);

Большое спасибо за помощь!

РЕДАКТИРОВАТЬ: я обнаружил, что я могу передать своему пользовательскому действию некоторые данные с:

/ DIR = "[TARGETDIR] \"

в CustomActionData.

Обычно говорят, что я могу получить его через

this.Context.Parameters["DIR"];

Но .... похоже, что в моем классе установщика this.Context имеет значение null: (

EDIT2: Контекст был нулевым, потому что я делал это в конструкторе, сейчас я делаю это в событии this.AfterInstall, и теперь я получаю контекст, который, кажется, содержит переменную "assemblypath", которая содержит точно путь мне нужен.

1 Ответ

37 голосов
/ 23 февраля 2011

Я предполагаю, что вы работаете с проектом установки здесь .....

Один из способов сделать это - я не говорю, что это лучший, но, вероятно, самый простой - это сделать следующее:

На вкладке «Файловая система» щелкните правой кнопкой мыши «Файловая система на целевом компьютере», «Добавить специальную папку», «Папка запуска пользователя», и такая папка появится в списке. Затем получите ярлык для вывода проекта (щелкнув правой кнопкой мыши) и перетащите его в папку «Автозагрузка».

И наконец, поскольку вы хотите, чтобы это было для всех пользователей, перейдите в Свойства проекта развертывания и установите для "InstallAllUsers" значение true.

Теперь при таком подходе есть одна оговорка: приложение запускается не при запуске Windows, а при входе в систему. Судя по тому, что вы говорите о своем проекте (приложении с пользовательским интерфейсом), все может быть в порядке.

Если вы действительно хотите взломать реестр, вы можете взглянуть на создание пользовательских действий DLL. Это то, где вы можете написать практически то, что вам нравится, и в конце процесса установки программа установки вызовет ваш dll, чтобы вы могли делать свои вещи. Вы можете передавать такие вещи, как путь к исполняемому файлу в качестве параметра, в dll (которую вы можете выбрать из диалогового окна установщика, а не из какого-либо объекта). Я не буду вдаваться в подробности, так как об этом должно быть много информации в Интернете.

Вы должны знать, что существует ограниченное количество информации, которую вы можете передать в dll - может быть всего 256 символов, если память не изменяет. Вы, вероятно, будете в порядке с просто путем, но когда вы начнете делать больше ....

Что касается определения, является ли пользователь локальным администратором, то это немного сложнее, хотя бы потому, что dll с настраиваемым действием запускается в конце установки, а не в начале - так что вы могли бы написать код, чтобы выяснить, в каких группах находится текущий пользователь, но есть вероятность, что вы взорвались бы до того, как этот код мог работать. Я не верю - по крайней мере, в проект установки Microsoft - что это можно знать.

...