【问题标题】:How Do I Reference the Application Settings of One Project from Another?如何从另一个项目中引用一个项目的应用程序设置?
【发布时间】:2011-05-16 09:03:50
【问题描述】:

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

在设置选项卡上,您可以选择访问修饰符。它可能是“朋友”或“公众”。据推测,当您选择“公共”时,您正在使其他程序集可以访问这些设置。但是,一旦选择了“公共”,我就无法弄清楚从另一个项目引用一个项目设置的语法。事实上,我看不出使用“内部”和“公共”作为访问修饰符之间的任何区别。

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

【问题讨论】:

  • 我原本以为这个问题同时适用于 VB 和 C#,所以我问了这两种语言的问题。然而,我现在意识到我对 C# 的理解是错误的——那里的语法并不神秘(使用 [Namespace].Properties.Settings.Default.[SettingName])。但是,我仍然没有弄清楚 VB 的语法,所以我编辑了这个问题以仅适用于 VB,并且我继续寻找该语言的答案。

标签: .net vb.net settings


【解决方案1】:

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

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

具有用户范围的设置存储在一个很难找回的文件中。此类文件的典型路径为 C:\Users\hpassant\AppData\Local\WindowsFormsApplication1\WindowsFormsApplication1._Url_2acx4ldi2zmg42elj3eyqq0snhqco4qe\1.0.0.0

第一部分是我,我的笔记本电脑的当前用户。路径名的怪异部分是 hash,它是应用程序名称和版本的唯一值。可能还有其他东西,比如我编译应用程序时的月相。计算该哈希的算法没有记录。只是它将是我的应用程序独有的,不能被其他应用程序踩踏。

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

【讨论】:

  • 汉斯,谢谢您的回复。我不明白细节,但我想我理解结论——“一个应用程序找不到另一个应用程序的用户范围设置”。但是,这在这里相关吗?我不是想让一个应用程序读取另一个应用程序的设置;我试图让一个项目读取(和写入)它引用的另一个项目的设置。
  • 是的,我认为这与我的回答的任期有关。您不能写入另一个应用程序的设置。除非它们位于您知道的可写位置。你知道他们被保存在哪里吗?
【解决方案2】:

我正在寻找同样的东西,所以它:
在 C# 中:
[命名空间].Properties.Settings.Default.[SettingName]
在 VB 中:
[命名空间].My.MySettings.Default.[设置名称]

【讨论】:

  • VB.NET 版本对我不起作用,尽管其他项目的设置为Public。我希望看到的是解决方案级别的设置对象;它是这样一个 PITA,例如,在项目之间传递数据库连接凭据。
  • 更新:这确实有效,但在项目的命名空间不同的情况下。参考我在别处的回答。 (为否决票道歉,但我不会让我删除它!)
【解决方案3】:

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

'在 DLL1 中: 第一类 Shared Property SettingsFromAnotherDLL As ApplicationSettingsBase ...

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

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

【讨论】:

  • 迈克,我尝试了类似于您建议的方法。我创建了一个单例,它有效地包装了设置单例并将其公开。无论设置访问修饰符设置为“朋友”还是“公共”,这都有效。我希望“公共”选项,一旦我理解了它的目的,会导致一个更简单的解决方案。
【解决方案4】:

这是获取位于我们正在执行的应用程序附近的任何.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;
}

【讨论】:

    【解决方案5】:

    这在 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 中对此进行了测试。区分你的根命名空间——如果可能的话——你会很开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2020-04-27
      • 2011-11-08
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多