如何从另一个项目引用一个项目的应用程序设置?

时间:2010-11-26 21:34:51

标签: .net vb.net settings

在VB.Net项目中,您可以使用属性页面的“设置”选项卡来定义应用程序设置。要在代码中引用设置,请使用VB中的语法My.Settings.SettingName。

在“设置”选项卡上,您可以选择“访问修改器”。它可能是"朋友"或" Public"。据推测,当您选择" Public"时,您正在使其他程序集可以访问这些设置。但是,一旦" Public"如果选择了,我无法弄清楚从另一个项目引用一个项目的设置的语法。事实上,我无法观察到使用"内部" vs." Public"作为访问修饰符。

我的问题:选择" Public"作为访问修饰符使其他程序集可以访问设置?如果是这样,从其他程序集引用设置的语法是什么?如果没有,那么" Public"办?

5 个答案:

答案 0 :(得分:6)

你把事情搞得一团糟。设置没有辅助功能修饰符,它们始终是公共的。但是,在Winforms应用程序中,您确实在控件的“属性”窗口中有一个“应用程序设置”属性。在顶部。还有一个Modifier属性。后者在VB.NET项目中默认为Friend,在C#app中为Private。这决定了 control 变量的可访问性,而不是设置。

是的,My.Settings允许您访问存储控件属性值的设置。但这就是好消息结束的地方。您应始终将设置设计器中的设置范围设置为“用户”。这样,当程序重新启动时,可以保存和恢复该值。

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

第一部分是我,我笔记本电脑的当前用户。路径名称的奇怪部分是哈希,这是应用程序名称和版本唯一的值。当我编译应用程序时,可能还有其他类似于月亮的阶段。没有记录计算该哈希的算法。只是它对我的应用程序来说是独一无二的,不能被另一个应用程序踩到。

这就是问题,一个应用无法找到另一个应用的用户范围设置。如果这对您很重要,您将不得不放弃使用设置。并在一个众所周知的位置用XmlDocument替换它。

答案 1 :(得分:2)

我正在寻找同样的事情,所以这就是:
在C#中:
    [命名空间] .Properties.Settings.Default。[SettingName]
在VB中:
    [命名空间] .My.MySettings.Default。[SettingName]

答案 2 :(得分:0)

我认为您可以将设置对象的实例从一个DLL传递到另一个DLL(例如在app启动时),然后使用此类的Item属性访问该设置(设置类是从ApplicationSettingsBase继承的类)

'在DLL1中: 1类 共享属性SettingsFromAnotherDLL As ApplicationSettingsBase ...

'在DLL2中:(在启动时完成) Class1.SettingsFromAnotherDLL = My.Settings.Default

'访问设置时在DLL2中 昏暗设置为STring = Class1.SettingsFromAnotherDLL.Item(“SettingKey”)

答案 3 :(得分:0)

以下是获取位于我们正在执行的应用程序附近的任何.exe的名为DataBaseName的值的示例代码,并将其存储在“dbName”变量中:

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

答案 4 :(得分:0)

在VB.NET中,这比在C#中更棘手。这主要是因为在VB.NET中,名称间距并不是一个很大的重点。因此,在VB.NET解决方案中,对于解决方案中的所有项目/子程序集具有相同的根(也称为默认)名称空间(虽然可能不是很好的做法)并不罕见-

MyNamespace.Main, MyNamespace.ClassLib1, MyNamespace.ClassLib2, MyNamespace.Common, etc.

因此,此问题中其他地方描述的项目间设置访问方法失败了。

在VB.NET中访问引用项目中的设置的建议方法是:

  1. 设置Settings访问修饰符Public
  2. 通过{MyNamespace}.My.MySettings.Default.{MySetting}访问设置(只读)。

请注意,My.MySettingsMyNamespace的直接属性,而不是程序集名称的

(如果子程序集的名称空间与引用项目的名称空间不同),您将可以访问MySetting。如果名称空间相同,就根本不可见,而且我找不到任何方法。 (我可以深入研究ILM,也许可以找到编译器在避免冲突时正在做什么-否则可能会发生这种情况-但这是有争议的。)

我已经在C#.NET和VB.NET中对此进行了测试。区分您的根名称空间-如果可能的话-您会感到高兴的。

相关问题