2010-11-26 76 views
6

在VB.Net项目中,您可以使用属性页面的设置选项卡来定义应用程序设置。要引用代码中的设置,可以使用VB中的语法My.Settings.SettingName。如何参考另一个项目的应用程序设置?

在设置选项卡上,您可以选择访问修饰符。它可能是“朋友”或“公共”。据推测,当您选择“公共”时,您正在使其他程序集可以访问该设置。但是,一旦选择“Public”,我就无法弄清楚引用另一个项目的设置的语法。实际上,我无法观察使用“内部”与“公共”作为访问修饰符的区别。

我的问题:选择“公共”作为访问修饰符使设置可以访问其他程序集?如果是这样,引用其他程序集设置的语法是什么?如果不是,那么“公共”是做什么的?

+0

我本来以为应用VB和C#这个问题,所以我要求这两种语言的问题。然而,我现在意识到我误解了C# - 关于那里的语法没有神秘感(使用[Namespace] .Properties.Settings.Default。[SettingName])。但是,我仍然没有弄清楚VB的语法,所以我编辑了这个问题只适用于VB,并且我继续寻求该语言的答案。 – 2010-11-26 22:25:12

回答

6

你正在混淆很糟糕的事情。一个设置没有可访问性修饰符,它们总是公开的。但是,在Winforms应用程序中,确实在控件的“属性”窗口中有一个“应用程序设置”属性。在顶部。还有一个Modifier属性。后者是朋友默认情况下在一个VB.NET项目,私人在C#应用程序。这决定了控制变量的可访问性,而不是设置。

是的,My.Settings可让您访问存储控件属性值的设置。但这正是好消息结束的地方。您应该始终将设置设计器中的设置范围设置为用户。这样,当程序开始备份时,可以保存和恢复该值。

用户范围的设置存储在很难找回的文件中。这种文件的典型路径是C:\ Users \ hpassant \ AppData \ Local \ WindowsFormsApplication1 \ WindowsFormsApplication1._Url_2acx4ldi2zmg42elj3eyqq0snhqco4qe \ 1.0.0.0

第一部分是我,我的笔记本电脑的当前用户。路径名称的bizarro部分是散列值,这是应用程序名称和版本唯一的值。当我编译应用程序时,可能还有其他类似月球的相位。计算该散列的算法没有记录。只是它对我的应用来说是独一无二的,不能被另一个应用踩踏。

这就是蹭,一个应用程序找不到另一个应用程序的用户范围设置。如果这对你很重要,你将不得不放弃使用设置。并用一个知名位置的XmlDocument替换它。

+0

Hans,谢谢你的回复。我不明白细节,但我想我明白了结论 - “一个应用程序无法找到其他应用程序的用户范围设置”。但是,这里有关吗?我并没有试图让一个应用程序读取另一个应用程序的设置;我试图让一个项目读取(并写入)其引用的另一个项目的设置。 – 2010-11-26 22:50:11

+2

是的,我认为这是相关的,我的答案的任期。你不能*写*另一个应用程序的设置。除非他们在您认识的可写位置*。你知道他们在哪里得救吗? – 2010-11-26 22:57:42

0

我想你可以通过你的设置实例从一个DLL对象到另一个DLL(在应用程序启动时说的),然后使用这个类的项目属性访问设置(设置类是从ApplicationSettingsBase继承类)

'在DLL1: 的Class1 共享属性SettingsFromAnotherDLL作为ApplicationSettingsBase ...

' 在DLL2:(在启动时进行) Class1.SettingsFromAnotherDLL = My.Settings.Default

“在DLL2访问设置时 昏暗环境作为字符串= Class1.SettingsFromAnotherDLL.Item(‘SettingKey’)

+0

迈克,我尝试了类似于你的建议。我创建了一个单例,它有效地包装Settings单例并将其公开。无论设置访问修饰符是设置为“朋友”还是“公共”,这都可以工作。我希望,一旦我明白其目的,“公共”选项将导致更简单的解决方案。 – 2010-11-26 23:12:25

0

下面是示例代码来获得的设置命名的任何DataBaseName值。EXE靠近我们执行的应用程序并将其存储在“数据库名”变量:

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

我一直在寻找同样的事情,所以这个吧:
在C#:
[命名空间] .Properties.Settings.Default [SettingName]
在VB:
[命名空间] .My.MySettings.Default [SettingName]