加载了错误的 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 的高度错误,因为加载时状态栏被隐藏

ASP.NET运行时错误:未能加载文件或程序集或它的某一依赖项.参数错误.

UI的加载/创建错误

angular-cli中的SCSS加载错误

从 S3 加载时,Redshift 使用了错误的时区

C# Assembly.Load() 方法加载了错误的 dll?