加载了错误的 App.config
Posted
技术标签:
【中文标题】加载了错误的 App.config【英文标题】:Wrong App.config being loaded 【发布时间】:2010-10-03 00:45:22 【问题描述】:我构建了一个 .NET 3.5 类库,它读取 App.config 文件以获取所需的值。当我在 Visual Studio 中测试它时,它可以很好地提取配置值。为了测试它,我只是将项目更改为控制台应用程序并执行方法调用。
我需要从许多其他 .NET 程序中调用这个类库,并且我希望类库是自给自足的(我应该能够从任何其他程序中调用它,并且它应该使用自己的配置文件,不知道任何调用配置文件等)。
我可以添加对 dll 的引用(因为我仍在开发中,所以我使用的是 VS 2008,还没有向 GAC 中添加任何内容)但是类库正在读取的 App.config 来自调用程序的 App .config,而不是类库的 App.config。
类库 dll 的配置文件在同一个目录下,所以应该可以找到它,调用的应用程序命名不同。我在 App.config 中使用标准键值对(例如配置文件 myClassLibrary.dll.config 的名称)并使用以下代码行获取值:
String myVal = ConfigurationSettings.AppSettings["myConfigSetting"];
有谁知道如何解决这个问题?
【问题讨论】:
【参考方案1】:我找不到避免为调用 dll/exe 等获取 app.config 的方法。我发现的唯一方法是使用硬编码路径并以这种方式加载它。这是我用来执行此操作的代码:
using System.Configuration;
...
public static KeyValueConfigurationCollection getAppSettingsFromAppConfig(String appConfigPath)
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = appConfigPath;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
AppSettingsSection section = config.AppSettings;
KeyValueConfigurationCollection appsettings = section.Settings;
return appsettings;
然后你有一个KeyValueConfigurationElement
的集合,你可以使用.Value
从配置文件中获取字符串。
【讨论】:
【参考方案2】:您可以将您的配置放在框架文件夹内的 machine.config 文件中,这样您就可以在该机器上运行的所有 .Net 应用程序中全局使用您的配置,
【讨论】:
【参考方案3】:我相信 app.config 将始终被可执行文件使用。只需将其放在该目录中即可。
他们这样做是为了确保可以共享 dll 而不必共享同一个 .config 文件。
您也许可以从可执行的 .config 文件创建链接
<appSettings configSource="\lib\app.config">
或者改个名字,我不明白你怎么能把两个app.config文件放在同一个目录里。他们不是同名吗?
<appSettings configSource="\lib.app.config">
【讨论】:
在构建程序集时它们不会都被重命名为 assemblyname.config 吗? 类库与调用应用程序是分开的,所以没有。我可以查看配置文件,打开它并验证所有设置是否正确。 看起来是正确的。习惯了web.config文件,不得不去查一下。 如果你不想链接文件,你可以将你的 assembly.config 中的值添加到你的 exe.app.config 中 我想要做的是能够从多个应用程序调用这个独立的类库(所有配置并准备好从它自己的配置文件中去),而无需修改每个调用应用程序的配置文件。这里的关键词是独立的。【参考方案4】:C# 中的应用程序域只能有一个程序集级 app.config 文件。 See here on MSDN。可执行文件将始终启动 AppDomain 并默认查找名称为:EXECUTABLE_NAME.config 的配置文件。例如,SampleApp01.exe 将查找 SampleApp01.exe.config 作为其配置文件。
【讨论】:
配置文件以正确的名称存在,但由于某种原因,当调用类库时它没有找到它,而是使用调用者的 app.config 这就是冲突。 “ConfigurationSettings”将只查找启动 appDomain 的程序集的配置文件。它永远不会查看您单独的程序集的配置文件。以上是关于加载了错误的 App.config的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationBar 的高度错误,因为加载时状态栏被隐藏