【问题标题】:Unable to read App.config from DLL无法从 DLL 读取 App.config
【发布时间】:2018-12-27 20:26:54
【问题描述】:

我已将包含一些 AppSettings 的 App.config 文件从同一解决方案的 EXE 项目中移至 DLL 项目中。之后我注意到使用配置管理器,我只得到空值。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
    <add key="Path1" value="C:\ProgramData\Resources\file2.xml" />
    <add key="Path2" value="C:\ProgramData\Development\file1.xml" />
</appSettings>
</configuration>

/* Reading */
public string Path1=> ConfigurationManager.AppSettings["Path1"];
public string Path2=> ConfigurationManager.AppSettings["Path2"];

如果我将 App.config 移回我的 EXE 项目,我可以使用配置管理器正确读取所有值。

所以,我的问题是,如果我的解决方案中只有 DLL (COM) 项目,而我无法控制 EXE(由 3rd 方开发)项目,那么如何使用 App.config 文件管理设置?

【问题讨论】:

  • 那么 exe 是否引用了 dll,而您正试图让 dll 读取配置?
  • 是的。但实际上,我无法控制 EXE,因为它是由其他人创建的,而我们是 DLL 提供者。在这种情况下,为了维护设置,除了让 App.config 带有 DLL 之外,我没有其他方法

标签: c# app-config


【解决方案1】:

配置文件不会编译到 dll 中。

应用程序将使用解决方案启动项目中的 app.config,除非您输入特殊代码以查看其他位置。

这是设计使然,因此您可以更改配置,而不必因为设置更改而重新编译。

【讨论】:

  • 我在问题中没有看到任何暗示编译该文件的内容?除非我误解了,否则文件听起来像是刚刚从一个项目转移到另一个项目。
  • 更准确地说,配置值是从启动项目的配置文件中读取的,而不是任何依赖项。
  • @BrootsWaymb - 我在他从他的项目中删除 app.Config 时阅读了它,也许我也误读了
  • @stuartd - 我认为这可能是问题的关键。我们没有被告知 exe 和 dll 的关系,或者 dll 在什么条件下试图访问配置,但如果它是 exe > dll > config,那就可以解释了。
  • @RJN - This question 可能比我在 cmets 中解释的更能帮助你理解
【解决方案2】:

您不应该将 app.config 用于类库中的任何设置。这样做是不好的做法,这也是微软不在类库中提供 app.config 的原因。

类库所需的任何值都应使用参数从应用程序传递给类。例如,在您的情况下,文件路径可以作为参数传递给您的类方法或构造函数等。

但如果您仍想访问,请尝试此选项
1. 将 System.Configuration.dll 的引用添加到您的类库中,并在 using 块中添加 using System.Configuration
2。编写代码以将 app.config 文件作为普通 xml 文件读取。有点像这样。

   string getFilePath()
   {
    string path = Path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase) + @"\ClassLibrary.dll.config";

    XDocument doc = XDocument.Load(path);

    var query = doc.Descendants("appSettings").Nodes().Cast<XElement>().Where(x => x.Attribute("key").Value.ToString() == key).FirstOrDefault();

    if (query != null)
    {
        return query.Attribute("value").Value.ToString();
    }

【讨论】:

  • 我的是 DLL 项目,我无法控制 EXE,所以我没有其他选项来存储许多设置。
  • @RJN - 好的,明白了。您可以尝试上述选项之一,看看它是否能达到您想要的结果。
  • 谢谢。这对我有用!附带说明,不要尝试使用 ConfigurationManager。它无法从类库中读取配置文件。例如,以下代码将不起作用: string value = ConfigurationManager.ConnectionStrings[key] ;字符串值 = ConfigurationManager.AppSettings[key];通过 xml 文档和 system.IO 阅读是您唯一的选择。
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2013-10-07
  • 2023-03-03
  • 2016-01-11
  • 2023-04-08
  • 2017-09-04
相关资源
最近更新 更多