2010-08-20 18 views
21

Actualmente estoy almacenando la configuración de mis complementos personalizados en el registro, pero esto parece un error. Me preguntaba si había un lugar oficial para almacenar configuraciones de complementos. Mi preferencia sería almacenarlos donde Visual studio almacena la configuración para que puedan exportarse e importarse fácilmente.¿Dónde debe almacenar una configuración de Visual Studio Add-in?

¿Es posible almacenar configuraciones de complementos con la configuración de Visual Studio o hay una forma mejor?

Respuesta

8

EDITAR

Mi respuesta original a este tema tuvo un par de cuestiones que descubrí después de años de usarlo. Lo he incluido a continuación para que esté completo, pero aquí están mis pensamientos actualizados sobre esto.

El uso de la configuración de la aplicación no es una versión segura en un VSIX. La ubicación de la ruta del archivo de configuración almacenada incluye en parte la cadena de versión y los hashes del ejecutable. Cuando Visual Studio instala una actualización oficial, estos valores cambian y como consecuencia cambian la ruta del archivo de configuración. Visual Studio en sí mismo no admite el uso de configuraciones de aplicaciones, por lo tanto, no intenta migrar este archivo a la nueva ubicación y toda la información se pierde esencialmente. El método de configuración admitido es WritableSettingsStore. Es muy similar a la configuración de la aplicación y bastante fácil acceso a través de SVsServiceProvider

public static WritableSettingsStore GetWritableSettingsStore(this SVsServiceProvider vsServiceProvider) 
{ 
    var shellSettingsManager = new ShellSettingsManager(vsServiceProvider); 
    return shellSettingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); 
} 

respuesta original

La forma más directa es el uso de la infraestructura de .Net Application Settings para almacenar la configuración. Es un marco maduro con soporte de diseñador para agregar una infraestructura de configuración a su proyecto.

Sin embargo, no se integra con la infraestructura de configuración de importación/exportación de Visual Studio. Conseguir que funcione es un proceso muy complicado que incluye registrarse como VSPackage, implementar un esquema de configuración, etc. ... En general, creo que realmente no vale la pena correr (nunca lo logró)

+0

Puedo estar muy lejos ya que esta es la primera vez que intento esto, pero la única forma en que parezco poder usar su código más nuevo es cambiar el tipo de parámetro de SVsServiceProvider a IServiceProvider. – jschroedl

9

Aquí hay un breve tutorial eso puede darle una idea de cómo lograr esto simplemente (es bastante sencillo una vez que lo haya hecho una vez).

He derivado el siguiente código de lo que uso en my extensions; está en VB.NET, pero se puede convertir fácilmente en C#.

Para comenzar, simplemente agregue esta clase a su proyecto de extensión. Debe contener una propiedad para cada valor que necesita almacenar. Incluso puedes organizarlos en categorías. Puede tener un vistazo at MSDN here para los tipos admitidos (para casos más complejos puede consultar "páginas de opciones personalizadas", que es un tema cubierto by MSDN here).

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Diagnostics 
Imports System.Globalization 
Imports System.Runtime.InteropServices 
Imports System.ComponentModel.Design 
Imports Microsoft.Win32 
Imports Microsoft.VisualStudio 
Imports Microsoft.VisualStudio.Shell.Interop 
Imports Microsoft.VisualStudio.OLE.Interop 
Imports Microsoft.VisualStudio.Shell 
Imports System.Threading 
Imports System.Text.RegularExpressions 
Imports System.ComponentModel 

<ClassInterface(ClassInterfaceType.AutoDual)> 
<CLSCompliant(False), ComVisible(True)> 
Public Class OptionPageGrid 
    Inherits DialogPage 

    Private _MyBooleanSetting As Boolean = False 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyBooleanSetting() As Boolean 
     Get 
      Return Me._MyBooleanSetting 
     End Get 
     Set(ByVal value As Boolean) 
      Me._MyBooleanSetting = value 
     End Set 
    End Property 

    Private _MyIntegerSetting As Integer = 2 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyIntegerSetting() As Integer 
     Get 
      Return Me._MyIntegerSetting 
     End Get 
     Set(ByVal value As Integer) 
      Me._MyIntegerSetting = value 
     End Set 
    End Property 

    Private _MyStringSetting As String = "DefaultStringValue" 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyStringSetting() As Integer 
     Get 
      Return Me._MyStringSetting 
     End Get 
     Set(ByVal value As Integer) 
      Me._MyStringSetting = value 
     End Set 
    End Property 
End Class 

A continuación, agregue los siguientes atributos justo antes de su clase de paquete maestro.

<ProvideOptionPage(GetType(OptionPageGrid), "The name or an alias of my extension name", "The name of a category of settings", 0, 0, True)> 
Public NotInheritable Class MyExtensionMainClass 
    Inherits Package 

Ahora para acceder fácilmente a la configuración, puede agregar la siguiente propiedad en su clase de cartón de envase:

Protected ReadOnly Property Settings() As OptionPageGrid 
    Get 
     Return CType(GetDialogPage(GetType(OptionPageGrid)), OptionPageGrid) 
    End Get 
End Property 

Esto hace que sea posible el acceso a un valor desde cualquier lugar de la clase utilizando un amistoso:

If (Me.Settings.MyBooleanSetting) Then MsgBox("It works!"); 

Visual Studio se hará cargo de la persistencia de la configuración, y deben ser incluidos cuando se utiliza la función de importación/exportación (o cualquier extensión ajustes de sincronización como this one).

+0

Gracias por los enlaces de MSDN. Estoy haciendo esto en C#, y sus muestras junto con las tuyas hacen que sea muy fácil ponerlo en funcionamiento. Sin embargo, señalaré a otros que usted muestra cómo crear la Página de Opciones de Grillas, donde quería crear una personalizada, ya que quería botones para que los usuarios hicieran clic. – deadlydog

+0

He escrito sobre cómo crear una página de opciones personalizadas en C# utilizando un UserControl de WPF para la interfaz de usuario, ya que los enlaces de MSDN solo muestran cómo hacerlo con Windows Forms. http://blog.danskingdom.com/adding-a-wpf-settings-page-to-the-tools-options-dialog-window-for-your-visual-studio-extension/ – deadlydog

Cuestiones relacionadas