Можно ли зарегистрировать переменные среды в проекте мастера установки? - PullRequest
8 голосов
/ 19 декабря 2011

Я создаю мастер установки Visual Studio 2008 для моей программы
http://support.microsoft.com/kb/307353
Я вижу, что есть возможность добавлять записи реестра и т.д .. Есть ли возможность зарегистрировать переменную среды Windows без написания настраиваемого действия?
И если мне нужно написать собственное действие, какой наименее болезненный способ сделать это?

Ответы [ 4 ]

7 голосов
/ 28 января 2014

Предупреждение : Please do not use this approach.Это опасно.Используйте встроенные функции MSI для обновления переменных среды.

Пример : запись прямо в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment - Path уничтожит все, что там уже есть.Очень серьезно.

Решение : MSI имеет таблицу Environment , которая обеспечивает надежное объединение и обновление переменных среды.Обратите внимание, что эта таблица также достаточно сложна, чтобы вызвать неожиданные результаты.Пожалуйста, проверьте хорошо.Особенно удаляйте сценарии.


Используя Visual Studio 2008, вы можете легко сделать это, установив соответствующую переменную в реестре Windows:

  1. В обозревателе решений:щелкните правой кнопкой мыши свой проект (не решение) и выберите Вид-> Реестр
  2. Создать раздел реестра (папку):
    1. Для Пользователя переменная: щелкните правой кнопкой мыши HKEY_CURRENT_USER , выберите « Новый ключ » и назовите его « Environment ».
    2. Для Системная переменная: щелкните правой кнопкой мыши на HKEY_LOCAL_MACHINE , выберите « Новый ключ » и назовите его « SYSTEM ».Продолжайте делать это, чтобы создать путь " HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment ".
  3. Щелкните правой кнопкой мыши Environment ключ (папка), выберите New-> String и дайте ему нужное имя.
  4. С выбранной строкой найдите окно Properties (Alt+ Enter вызовет его)
  5. В окне свойств введите значение , которое вы хотите.

Если вы хотите, чтобы значение ссылалось на каталог установки, вы можете сделать это следующим образом, используя переменные свойства: [TARGETDIR] SomeFile.ext (дополнительные переменные свойства см. В http://msdn.microsoft.com/en-us/library/aa370905%28v=vs.85%29.aspx)

3 голосов
/ 23 июня 2016

В верхнем ответе объясняется, как это сделать без настраиваемого действия, но те, кто ищет настраиваемое действие, могут использовать следующий код в качестве шаблона:

 [RunInstaller(true)]
public partial class GRInstallCustomAction : System.Configuration.Install.Installer
{
    string environmentKey = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
    string pathUrl = "C:\\Program Files (86)\\TargetFolder";
    public GRInstallCustomAction()
    {
        InitializeComponent();
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);

        string environmentVar = Environment.GetEnvironmentVariable("PATH");


        //get non-expanded PATH environment variable            
        string oldPath = (string)Registry.LocalMachine.CreateSubKey(environmentKey).GetValue("Path", "", RegistryValueOptions.DoNotExpandEnvironmentNames);


        var index = oldPath.IndexOf(pathUrl);
        if (index < 0)
        {
            //set the path as an an expandable string
            Registry.LocalMachine.CreateSubKey(environmentKey).SetValue("Path", oldPath + ";" + pathUrl, RegistryValueKind.ExpandString);
        }

    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);


    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);

        //get non-expanded PATH environment variable            
        string oldPath = (string)Registry.LocalMachine.CreateSubKey(environmentKey).GetValue("Path", "", RegistryValueOptions.DoNotExpandEnvironmentNames);

        string removeString = pathUrl + ";";
        var index = oldPath.IndexOf(removeString);
        if (index < 0)
        {
            removeString = pathUrl;
            index = oldPath.IndexOf(removeString);
        }

        if (index > -1)
        {
            oldPath = oldPath.Remove(index, pathUrl.Length);
            //set the path as an an expandable string
            Registry.LocalMachine.CreateSubKey(environmentKey).SetValue("Path", oldPath, RegistryValueKind.ExpandString);
        }
    }
}

В этом пошаговом руководстве показано, как создать и применить настраиваемое действие: https://msdn.microsoft.com/en-us/library/d9k65z2d(v=vs.100).aspx

3 голосов
/ 19 декабря 2011

Установщик Windows поддерживает переменные среды через таблицу Среда , но проекты установки Visual Studio не позволяют использовать ее.

Решение состоит в том, чтобы использовать другой инструмент создания настроек, который поддерживает переменные среды: http://en.wikipedia.org/wiki/List_of_installation_software

Другое решение - вручную добавить его в таблицу Environment, отредактировав MSI с помощью Orca .

Также вы упомянули подход с пользовательскими действиями.

0 голосов
/ 03 января 2019

Ickydime (см. Ответы выше). Пример настраиваемого действия показывает, как добавить переменную среды путем расширения переменной PATH env.Ниже я поделюсь, как создать новую переменную среды, используя Environment.SetEnvironmentVariable

    string environmentKey = "MY_VAR";
    string pathUrl = "%ProgramFiles%\\...";
    public Installer1()
    {
        InitializeComponent();
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
        Environment.SetEnvironmentVariable(environmentKey, pathUrl, EnvironmentVariableTarget.Machine);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
        Environment.SetEnvironmentVariable(environmentKey, null, EnvironmentVariableTarget.Machine);
    }
...