2010-11-26 23 views
6

En un proyecto de VB.Net, puede usar la pestaña Configuración de la página de propiedades para definir la configuración de la aplicación. Para hacer referencia a las configuraciones en el código, use la sintaxis My.Settings.SettingName en VB.¿Cómo hago referencia a la configuración de la aplicación de un proyecto desde otro?

En la pestaña Configuración, puede elegir el Modificador de acceso. Puede ser "Amigo" o "Público". Presumiblemente, cuando elige "Público", está haciendo que la configuración esté accesible para otros ensamblajes. Sin embargo, una vez que se elige "Público", no puedo entender la sintaxis para hacer referencia a la configuración de un proyecto de otro. De hecho, no puedo observar ninguna diferencia entre usar "Interno" vs. "Público" como el modificador de acceso.

Mi pregunta: ¿La elección de "Público" como el modificador de acceso hace que las configuraciones sean accesibles para otros ensamblajes? Si es así, ¿cuál es la sintaxis para referenciar la configuración de otros ensamblajes? Si no, ¿qué hace "Público"?

+0

originalmente pensé que este tema se aplica tanto a VB y C#, así que la pregunta para ambos idiomas.. Sin embargo, ahora me doy cuenta de que estaba equivocado sobre C# - no hay ningún misterio sobre la sintaxis allí (use [Namespace] .Properties.Settings.Default. [SettingName]). Sin embargo, todavía no he descubierto la sintaxis para VB, así que edité la pregunta para aplicar solo a VB y continúo buscando una respuesta para ese idioma. –

Respuesta

6

Estás mezclando bastante las cosas. Una configuración no tiene un modificador de accesibilidad, siempre son públicos. Sin embargo, en una aplicación de Winforms, de hecho tiene una propiedad de "Configuración de la aplicación" en la ventana Propiedades para un control. Justo en la parte superior. Y una propiedad Modificador. Este último es Friend de forma predeterminada en un proyecto de VB.NET, Private en una aplicación de C#. Eso determina la accesibilidad de la variable de control , no la configuración.

Sí, My.Settings le da acceso a la configuración que almacena el valor de la propiedad de control. Pero ahí es donde terminan las buenas noticias. Siempre debe establecer el Alcance de la configuración en el diseñador de configuraciones en Usuario. Para que el valor se pueda guardar y restaurar cuando el programa se inicie.

Las configuraciones con el alcance del usuario se almacenan en un archivo que es difícil de encontrar. La trayectoria típica de dicho archivo es C: \ Users \ hpassant \ AppData \ Local \ WindowsFormsApplication1 \ WindowsFormsApplication1._Url_2acx4ldi2zmg42elj3eyqq0snhqco4qe \ 1.0.0.0

La primera parte es yo, el usuario actual de mi portátil. La parte bizarro del nombre de ruta es hash, un valor que es único para el nombre y la versión de la aplicación. Y probablemente algo más como la fase de la luna cuando compilé la aplicación. El algoritmo para calcular ese hash no está documentado. Solo que será único para mi aplicación y no podrá ser pisoteado por otra aplicación.

Y ese es el problema, una aplicación no puede encontrar la configuración del usuario para otra aplicación. Tendrás que renunciar al uso de la configuración si eso es importante para ti. Y reemplácelo con, por ejemplo, un XmlDocument en una ubicación conocida.

+0

Hans, gracias por la respuesta. No entiendo los detalles, pero creo que entiendo la conclusión: "una aplicación no puede encontrar la configuración del usuario para otra aplicación". Sin embargo, ¿eso es relevante aquí? No estoy tratando de obtener una aplicación para leer la configuración de otra aplicación; Estoy intentando que un proyecto lea (y escriba) las configuraciones de otro proyecto al que hace referencia. –

+2

Sí, creo que es relevante aquí, la tenencia de mi respuesta. No puede * escribir * la configuración de otra aplicación. A menos que se encuentren en una ubicación de escritura que * conozca *. ¿Sabes dónde se guardan? –

0

Creo que se puede pasar una instancia de la configuración de objeto desde un archivo DLL en otro DLL (digamos en el arranque de aplicaciones) y luego acceder a la configuración mediante la propiedad de artículos de esta clase (ajuste clases son de clase heredada de ApplicationSettingsBase)

'en DLL1: Clase 1 de propiedades compartidas SettingsFromAnotherDLL Como ApplicationSettingsBase ...

' en DLL2: (hecho en el arranque) Class1.SettingsFromAnotherDLL = My.Settings.Default

'En DLL2 cuando se accede a la configuración de Ajuste Dim como secuencia = Class1.SettingsFromAnotherDLL.Item ('SettingKey')

+0

Mike, intenté algo similar a lo que propones. Creé un singleton que envuelve con eficacia el singleton Configuraciones y lo hace público. Eso funciona independientemente de si el modificador de acceso a la configuración está configurado en "Amigo" o "Público". Esperaba que la opción "Pública", una vez que entiendo su propósito, condujera a una solución más simple. –

0

Aquí es código de ejemplo para obtener el valor de configuración denominada DataBaseName de cualquier.exe situado cerca de nuestra aplicación en ejecución y almacenarlo en "dbName" variables:

string currentDirectory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
string exeName = System.IO.Path.GetFileName(Assembly.GetExecutingAssembly().Location); 
FileInfo[] fileInfos = new DirectoryInfo(currentDirectory).GetFiles("*.exe"); 
foreach (FileInfo fi in fileInfos) 
{ 
    if (fi.FullName == System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) continue; 

    Assembly asm = Assembly.LoadFrom(fi.FullName); 
    Type[] allTypes = asm.GetTypes(); 
    foreach (Type type in allTypes) 
    { 
     if (type.Name != "Settings") continue; 
     Type settingsType = type; 

     PropertyInfo propDefault = type.GetProperty("Default"); 
     object defaultSettings = propDefault.GetValue(null, null); 
     PropertyInfo piDBName = settingsType.GetProperty("DataBaseName"); 
     string dbName = (string)piDBName.GetValue(defaultSettings, null); 

     break; 
    } 

    break; 
} 
3

que estaba buscando lo mismo, así que esto es:
En C#:
[Espacio de nombres] .Properties.Settings.Default . [SettingName]
En VB:
[Espacio de nombres] .My.MySettings.Default [SettingName]

+0

La versión VB.NET de esto no funciona para mí, a pesar de hacer las configuraciones del otro proyecto 'Pública'. Lo que me gustaría ver es un objeto de configuración a nivel de Solución; es un PITA que pasa, digamos, las credenciales de conexión de la base de datos entre proyectos. – SteveCinq

Cuestiones relacionadas