不幸的是,.NET没有提供轻松读取DLL的app.config文件的方法。唯一“简单”的解决方案是在每个Web服务配置文件中存储连接字符串,这完全是错误的。
通常,我关注代码的优雅性,但这次我确实需要一个解决方案,即使它是一个hack。是否有任何方法使.NET类库拥有自己的配置?
编辑:从技术上讲,我可以将所有这些Web服务合并成一个Web服务。但是,由于业务原因(每个Web服务将单独出售),我不能这样做。
虽然已经过去一年,但我仍然使用这种方法来读取每个设置:
Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings");
ClientSettingsSection c = (ClientSettingsSection)csg.Sections["Add your section name here, e.g. Your.Namespace.Properties.Settings"];
foreach (SettingElement e in c.Settings)
{
Debug.WriteLine("SETTING NAME: " + e.Name);
SettingValueElement v = e.Value;
Debug.WriteLine("SETTING VALUE: " + v.ValueXml.InnerText);
}
这适用于在类库项目中创建的设置文件。 设置文件应命名为"YourLibrary.dll.config",然后部署到库的位置。设置文件应具有类似以下内容:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Your.NameSpace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<applicationSettings>
<Your.NameSpace.Properties.Settings>
<setting name="YourLibrary_WebReferences_YourWebService" serializeAs="String">
<value>http://localhost:3861/YourWebService.asmx</value>
</setting>
<setting name="AnotherSetting" serializeAs="String">
<value>False</value>
</setting>
</Your.NameSpace.Properties.Settings>
</applicationSettings>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
我从未需要从配置文件中读取连接字符串,但是通过改变打开exe配置后获取的区域组的名称,应该是可以实现的。
我需要这样做的原因是,我有一个用户控件,包装了一个ActiveX/COM库,然后在“object”标记中由IE托管。我已经让“param”标记起作用了,所以我本可以使用该机制将设置传递给用户控件,但当时这种方法似乎是一个合乎逻辑的选择。此外,我也不会让这个特定的问题打败我!
希望这对pridmorej有帮助 :)
我想您正在寻找:
ConfigurationManager.OpenExeConfiguration(string exePath)
或者
ConfigurationManager.OpenMappedExeConfiguration(
new ExeConfigurationFileMap() {
ExeConfigFilename = path + "app.config"
}, ConfigurationUserLevel.None);
该方法返回一个Configuration
对象。有关ConfigurationManager的详细信息,请参阅MSDN文档。
尝试此问题以获取DLL路径。
Server.MapPath
来获取绝对路径,否则你需要使用Environment.CurrentDirectory
或类似的方法。 - s_hewittConfigurationManager.OpenExeConfiguration
对我来说不起作用。
但是,Properties.Settings.Default.<SettingName>
很好用。
http://msdn.microsoft.com/en-us/library/ff664552(v=pandp.50).aspx
并且要将企业库配置工具(GUI)集成到Visual Studio中,请尝试这里:http://visualstudiogallery.msdn.microsoft.com/029292f0-6e66-424f-8381-3454c8222f9a
学习曲线一开始可能会让人感到有些压力,但是它非常值得努力,特别是当你处理复杂的企业生态系统时。集成工具实际上使得设置一个非常复杂的配置系统变得非常容易,并且可以在您的要求发生变化时进行管理。是否可以从每个 Web 服务的配置中引用库的配置文件作为选项?在 .NET 中有一种类似于 XML 包含机制的方法:
使用 XML 包含或在 app.config 中使用配置引用来包含其他配置文件的设置
http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx
虽然您仍然需要编辑每个 web.config 文件,但实际内容只需在一个位置维护。
您可以从托管应用程序的 web.config
或 app.config
中读取类库的配置设置。
如果在控制台应用程序中引用了类库,请将类库所需的设置放在控制台应用程序的 app.config 中(例如在 appSettings 下),并使用 System.Configuration
下的 ConfigurationManager 从类库中读取它。
如果在 Web 应用程序中引用了类库,请将类库所需的设置放在 Web 应用程序的 web.config
中(例如在 appSettings 下),并使用 System.Configuration
下的 ConfigurationManager 从类库中读取它。