我的主应用程序的GUI组件是它自己的项目,主应用程序在运行时只使用GUI组件的.dll。由于userSettings
存储在GUI组件的app.config
中,主应用程序没有复制,我无法保存userSettings(没有创建user.config)。
我看到的可能的方法是能够将组件的userSettings
存储在外部配置文件(由其app.config
引用)中,该文件在运行时复制到主应用程序的目录,或者以某种方式将所有userSettings
放在主应用程序的级别(因为它的.exe.config
被复制)并从GUI组件访问它。
但是,我无法使用其中任何一种方法来保存userSettings
。有任何想法吗?如果需要澄清,请告诉我。
答案 0 :(得分:6)
您应该能够将Settings
从主项目属性移动到GUI组件DLL的属性(或者如果您愿意,可以创建Settings.dll
。)
然后从主应用程序引用此DLL并添加using
语句,以便您可以访问Settings.Default
。然后,您必须更改设置文件的访问修饰符。这有点不明显,但在MSDN documentation中有所解释。这是一个截图:
将此更改为“公开”后,您只需从应用程序的任何位置读取设置即可。
警告:每个正在运行的应用程序的设置不超过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 文件位于同一位置的配置文件,它就应该像您希望的那样工作。