2010-11-26 3 views
6

In einem VB.Net-Projekt können Sie die Registerkarte Einstellungen der Eigenschaftenseite verwenden, um Anwendungseinstellungen zu definieren. Um die Einstellungen im Code zu referenzieren, verwenden Sie die Syntax My.Settings.SettingName in VB.Wie referenziere ich die Anwendungseinstellungen eines Projekts von einem anderen?

Auf der Registerkarte Einstellungen wählen Sie den Access Modifier. Es kann "Freund" oder "Öffentlich" sein. Wenn Sie "Öffentlich" auswählen, nehmen Sie die Einstellungen vermutlich für andere Assemblys vor. Sobald jedoch "Public" ausgewählt ist, kann ich die Syntax nicht herausfinden, um die Einstellungen eines Projekts von einem anderen zu referenzieren. Tatsächlich kann ich keinen Unterschied zwischen der Verwendung von "Internal" und "Public" als Zugriffsmodifizierer feststellen.

Meine Frage: Macht die Wahl von "Public" als Zugriffsmodifikator Einstellungen für andere Baugruppen zugänglich? Wenn ja, wie lautet die Syntax, um auf die Einstellungen anderer Assemblies zu verweisen? Wenn nicht, was macht "Public"?

+0

ich dachte ursprünglich dieses Problem sowohl für VB und C# angewendet, so fragte ich die Frage für beide Sprachen.. Allerdings merke ich jetzt, dass ich mich bei C# falsch verhielt - es gibt kein Geheimnis um die Syntax dort (benutze [Namespace] .Properties.Settings.Default. [SettingName]). Ich habe jedoch immer noch nicht die Syntax für VB herausgefunden, also habe ich die Frage so bearbeitet, dass sie nur für VB gilt, und ich suche weiterhin nach einer Antwort für diese Sprache. –

Antwort

6

Sie vermischen Dinge ziemlich schlecht. Eine Einstellung hat keinen Accessibility-Modifikator, sie sind immer öffentlich. In einer Winforms-App verfügen Sie jedoch tatsächlich über die Eigenschaft "Anwendungseinstellungen" im Eigenschaftenfenster für ein Steuerelement. Ganz oben. Und eine Modifier-Eigenschaft. Letzteres ist standardmäßig in einem VB.NET-Projekt, Privat in einer C# -App. Das bestimmt die Erreichbarkeit der Steuerung Variable, nicht die Einstellung.

Ja, My.Settings gibt Ihnen Zugriff auf die Einstellung, die den Steuereigenschaftswert speichert. Aber hier enden die guten Nachrichten. Sie sollten den Bereich der Einstellung im Einstellungsdesigner immer auf Benutzer festlegen. Damit kann der Wert gespeichert und wiederhergestellt werden, wenn das Programm neu gestartet wird.

Einstellungen mit Benutzerbereich werden in einer Datei gespeichert, die schwer zu finden ist. Der typische Weg für eine solche Datei ist C: \ Benutzer \ hpassant \ AppData \ Local \ WindowsFormsApplication1 \ WindowsFormsApplication1._Url_2acx4ldi2zmg42elj3eyqq0snhqco4qe \ 1.0.0.0

Der erste Teil ist mir, der aktuelle Benutzer von meinem Laptop. Der Bizarro-Teil des Pfadnamens ist ein Hash, ein Wert, der für den Anwendungsnamen und die Version eindeutig ist. Und wahrscheinlich noch etwas wie die Phase des Mondes, als ich die App kompilierte. Der Algorithmus zum Berechnen dieses Hash ist nicht dokumentiert. Nur dass es für meine App einzigartig ist und nicht von einer anderen App gestampft werden kann.

Und das ist der Haken, eine App kann die Benutzerbereichseinstellungen für eine andere App nicht finden. Sie müssen die Verwendung von Einstellungen aufgeben, wenn dies für Sie wichtig ist. Und ersetzen Sie es mit einem XmlDocument an einem bekannten Ort.

+0

Hans, Vielen Dank für die Antwort. Ich verstehe die Details nicht, aber ich denke, ich verstehe die Schlussfolgerung - "Eine App kann die benutzerdefinierten Einstellungen für eine andere App nicht finden". Ist das hier relevant? Ich versuche nicht, eine App dazu zu bringen, die Einstellungen einer anderen App zu lesen. Ich versuche, ein Projekt dazu zu bringen, die Einstellungen eines anderen Projekts, auf das es verweist, zu lesen (und zu schreiben). –

+2

Ja, ich denke, dass es hier relevant ist, die Dauer meiner Antwort. Sie können die Einstellungen einer anderen App nicht * schreiben *. Es sei denn, sie befinden sich an einem beschreibbaren Ort, den Sie * kennen *. Weißt du, wo sie gespeichert sind? –

0

ich denke, Sie eine Instanz Ihrer Einstellungen Objekt von einer DLL in eine andere DLL (sagen bei app Start) passieren kann und dann die Einstellung Zugriff auf die Item-Eigenschaft dieser Klasse mit (Einstellung Klassen sind Klasse von Application geerbt)

'In DLL1: Class1 Shared Property SettingsFromAnotherDLL Als Application ...

' In DLL2: (beim Start geschehen) Class1.SettingsFromAnotherDLL = My.Settings.Default

‚In DLL2 wenn As String = Class1.SettingsFromAnotherDLL.Item (‚SettingKey‘)

+0

Mike, ich habe versucht, etwas, was Sie vorschlagen. Ich habe ein Singleton erstellt, das das Settings-Singleton effektiv umschließt und es öffentlich macht. Das funktioniert unabhängig davon, ob der Einstellungszugriffsmodifikator auf "Friend" oder "Public" eingestellt ist. Ich hatte gehofft, dass die Option "Öffentlich", sobald ich ihren Zweck verstanden habe, zu einer einfacheren Lösung führen würde. –

0

Hier ist ein Beispielcode zu erhalten Wert der Einstellung DataBaseName von jedem benannten Einstellungen Dimmungseinstellung erreichbar.exe in der Nähe unserer Ausführung Anwendung und speichern sie in "dbName" Variable:

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

Ich war für die gleiche Sache suchen, so dass diese es:
In C#:
[Namespace] .Properties.Settings.Default . [Setting]
In VB:
[Namespace] .My.MySettings.Default [Setting]

+0

Die VB.NET-Version von diesem funktioniert nicht für mich, trotz der Einstellungen des anderen Projekts 'Public'. Was ich gerne sehen würde, ist ein Einstellungsobjekt auf Lösungsebene; Es ist ein solches PITA, das etwa Datenbankverbindungsnachweise zwischen Projekten übermittelt. – SteveCinq