访问Properties.Settings DLL中的userSettings

时间:2011-06-22 20:07:13

标签: c# .net

我的主应用程序的GUI组件是它自己的项目,主应用程序在运行时只使用GUI组件的.dll。由于userSettings存储在GUI组件的app.config中,主应用程序没有复制,我无法保存userSettings(没有创建user.config)。

我看到的可能的方法是能够将组件的userSettings存储在外部配置文件(由其app.config引用)中,该文件在运行时复制到主应用程序的目录,或者以某种方式将所有userSettings放在主应用程序的级别(因为它的.exe.config被复制)并从GUI组件访问它。

但是,我无法使用其中任何一种方法来保存userSettings。有任何想法吗?如果需要澄清,请告诉我。

3 个答案:

答案 0 :(得分:6)

您应该能够将Settings从主项目属性移动到GUI组件DLL的属性(或者如果您愿意,可以创建Settings.dll。)

然后从主应用程序引用此DLL并添加using语句,以便您可以访问Settings.Default。然后,您必须更改设置文件的访问修饰符。这有点不明显,但在MSDN documentation中有所解释。这是一个截图:

enter image description here

将此更改为“公开”后,您只需从应用程序的任何位置读取设置即可。

警告:每个正在运行的应用程序的设置不超过1个,因为实现是单例,您将获得意外结果。如果你有一个设置副本,它不需要在.exe dll中 - 它可以在你想要的任何地方。

我假设您不是要在应用程序之间重复使用。

答案 1 :(得分:1)

啊 - 可怕的属性。设置!

这有几种方法,但都涉及一些返工。

最简单 - 使用appsettings而不是ApplicationSettings: 将所需的appsettings复制到使用它的每个应用程序中。

优点:简单,缺点:随处配置设置!

创建自定义配置部分:关于此的大量文章 - 例如,请参阅http://joelabrahamsson.com/entry/creating-a-custom-configuration-section-in-net

基本上,您可以将单独的配置文件复制到需要它的每个可部署中 - 只需引用在每个需要它的可部署中创建配置对象的程序集,并更新应用程序配置文件以供参考包含的自定义配置文件。

优点:整洁,您可以在配置对象,Tidier配置文件中包装验证,缺点:设置时间稍长。

还有其他一些 - 包括在XML文件中存储值并在运行时将其反序列化为类。使用相同的方法,但存储在数据库中。等等。

答案 2 :(得分:0)

这是我如何解决这个问题的方法。假设我们正在构建 MyDll.dll 并且我们想用 MyDll.dll.config 文件配置它。首先,获取包含属性设置的 MyDll.dll.config 文件部分的片段。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="MyDll.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <applicationSettings>
    <MyDll.Properties.Settings>
      <setting name="MySvrName" serializeAs="String">
        <value>MyServer</value>
      </setting>
      <setting name="MyDbName" serializeAs="String">
        <value>MyDb</value>
      </setting>
    </MPMLaborService2.Properties.Settings>
  </applicationSettings>
</configuration>

在 MyDll 项目中创建一个名为 ConfigReader.cs 之类的新类并删除默认类代码,但保留命名空间。复制上面的 XML(从您的项目)并使用 Visual Studio 编辑 -> 选择性粘贴 -> 将 XML 作为类粘贴到该类中。这将构建类来读/写配置文件。

将这些“using”语句添加到您希望构造函数从配置文件读取的一个或多个类中:

using System.Xml.Serialization;
using System.Reflection;
using System.IO;

在模块级别或构造函数中声明“配置阅读器”:

private configuration _Cfg = null;

还需要一些其他变量:

private string _SvrName = "", _DbName = "";  // Module level
string path = "";
XmlSerializer serializer = null;
configurationApplicationSettingsSetting stg = null;

将其放入构造函数以读取设置:

path = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(path))
{
  throw new Exception("Config file not found:\r\n" + path);
}
serializer = new XmlSerializer(typeof(configuration));
using (StreamReader sr = new StreamReader(path))
{
  _Cfg = (configuration)serializer.Deserialize(sr);
}
if (_Cfg.applicationSettings.MyDllPropertiesSettings == null)
{
  throw new Exception("Property settings not found.");
}
stg = _Cfg.applicationSettings.MyDllPropertiesSettings
                 .FirstOrDefault(x => x.name == "MySvrName");
if (object.ReferenceEquals(stg, null))
{
  throw new Exception("Can't find setting 'MySvrName'");
}
_SvrName = stg.value;
stg = _Cfg.applicationSettings.MyDllPropertiesSettings
             .FirstOrDefault(x => x.name == "MyDbName");
if (object.ReferenceEquals(stg, null))
{
  throw new Exception("Can't find setting 'MyDbName'");
}
_DbName = stg.value;

只要您有权读取与 MyDll.dll 文件位于同一位置的配置文件,它就应该像您希望的那样工作。