Reputation: 853
I have a setup project in Visual Studio 2010 that I use to create an installation kit (MSI). I need to update the environment path to add an entry when the MSI is installed. Any idea how to do that?
I can't find the option that let me access the environment. Only thing I see that might do is to directly edit the registry. Anything better I can do, or that is my only option?
Thanks Tony
Upvotes: 6
Views: 4508
Reputation: 9
I found ickydime's answer very helpful, with the addition of the path to my executing assembly this was perfect:
string pathUrl = System.IO.Path.GetDirectoryName(this.Context.Parameters["assemblypath"]);
Upvotes: 0
Reputation: 1071
I had success using the Setup Project within Visual Studio (2015) and adding a custom action that altered the registry as shown in this answer:
GetEnvironmentVariable() and SetEnvironmentVariable() for PATH Variable
The following code is for a custom action that should be applied to the commit/install/and uninstall actions of a setup project:
[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);
}
}
}
Upvotes: 2
Reputation: 21436
Visual Studio setup projects cannot set environment variables. However, you can try using a custom action. Here is some sample VBScript code:
Set WshShell = CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("SYSTEM")
WshEnv("Path") = WshEnv("Path") & ";myPath"
You can copy it in a .VBS file and add that file as an install custom action.
Upvotes: 5