2011-12-19 6 views
7

Estoy creando un Asistente de instalación de Visual Studio 2008 para mi programa
http://support.microsoft.com/kb/307353
veo que es posible añadir entradas de registro, etc .. ¿Existe una posibilidad de registrar variable de entorno de Windows sin necesidad de escribir una acción personalizada?
Y si debo escribir una acción personalizada, ¿cuál es la forma menos dolorosa de hacerlo?¿Es posible registrar variables de entorno en el proyecto del asistente de instalación?

+0

No existe Visual Studio 2009. Y puedo contar el número de instancias en una mano donde un instalador realmente necesita registrar una variable de entorno. Las posibilidades son * muy * buenas de que no seas uno de esos casos. –

+0

@CodyGray, por favor explique las posibles alternativas. –

+1

Supongo que recomendaría el registro o un archivo de datos en el directorio del perfil del usuario/directorio de datos del programa. O si su proyecto es un proyecto .Net, un valor de app.config. Aunque estoy en desacuerdo con el sentido de la declaración, si agrega su programa al 'PATH', esa podría ser una buena razón para rebuscar con variables de entorno. De lo contrario, estaría de acuerdo en que probablemente haya mejores lugares para poner sus datos. –

Respuesta

6

mediante Visual Studio 2008, que fácilmente puede hacerlo estableciendo la variable correspondiente en el registro de Windows:

  1. En el Explorador de soluciones, haga clic en su proyecto (no la solución), y seleccione Ver -> registro
  2. Crear la clave de registro (carpeta):
    1. Para una variable de usuario: Haga clic en HKEY_CURRENT_USER, seleccione "Nueva clave ", y asígnele el nombre" Entorno ".
    2. Para una variable de sistema: Haga clic en HKEY_LOCAL_MACHINE , seleccione "nueva clave", y el nombre "SISTEMA". Continúe haciendo esto para crear la ruta "HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment".
  3. Haga clic en la tecla deMedio Ambiente (carpeta), seleccione Nuevo-> Cadena, y darle el nombre que desee.
  4. Con la cadena seleccionada, encontrar los Propiedades ventana (Alt + Enter traerá para arriba)
  5. En la ventana Propiedades, rellenar el Valor desea.

Si desea que el valor haga referencia al directorio de instalación, puede hacerlo así utilizando las variables de propiedad: [TARGETDIR] SomeFile.ext (ver http://msdn.microsoft.com/en-us/library/aa370905%28v=vs.85%29.aspx para más variables de las propiedades)

1

Windows Installer admite variables de entorno a través de la tabla Environment, pero los proyectos de instalación de Visual Studio no permiten su uso.

Una solución es utilizar una herramienta de autoría de configuración diferente que soporta las variables de entorno: http://en.wikipedia.org/wiki/List_of_installation_software

Otra solución es añadir manualmente en la tabla de Medio Ambiente mediante la edición del MSI con Orca.

También existe el enfoque de acción personalizada que mencionaste.

3

principio Respuesta explica cómo hacerlo sin una acción personalizada, pero aquellos que buscan una acción personalizada puede utilizar el siguiente código como una plantilla:

[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); 
     } 
    } 
} 

Este paseo a través le muestra cómo crear y aplicar la acción personalizada: https://msdn.microsoft.com/en-us/library/d9k65z2d(v=vs.100).aspx

Cuestiones relacionadas