【问题标题】:Wrong App.config being loaded加载了错误的 App.config
【发布时间】: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"];

有谁知道如何解决这个问题?

【问题讨论】:

    标签: c# .net .net-3.5 configuration c#-3.0


    【解决方案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 的程序集的配置文件。它永远不会查看您单独的程序集的配置文件。
        猜你喜欢
        • 2013-04-18
        • 1970-01-01
        • 2010-10-14
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多