C# 无法从DLL读取App.config

C# 无法从DLL读取App.config,c#,app-config,C#,App Config,我已将包含一些AppSettings的App.config文件从同一解决方案的EXE项目移动到DLL项目中。在这之后,我注意到使用Configuration manager时,只会得到空值 <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="Path1" value="C:\ProgramData\Resources\file2.xml" /

我已将包含一些AppSettings的App.config文件从同一解决方案的EXE项目移动到DLL项目中。在这之后,我注意到使用Configuration manager时,只会得到空值

<?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"];

/*阅读*/
公共字符串Path1=>ConfigurationManager.AppSettings[“Path1”];
公共字符串Path2=>ConfigurationManager.AppSettings[“Path2”];
如果我将App.config移回我的EXE项目中,我可以使用configuration manager正确读取所有值


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

配置文件不会编译到DLL中

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


这是经过设计的,这样您就可以更改配置,而不必仅仅因为设置已更改而重新编译。

配置文件不会编译到dll中

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


这是经过设计的,这样您就可以更改配置,而不必仅仅因为设置已更改而重新编译。

您不应该对类库中的任何设置使用app.config。这样做是不好的做法,这也是为什么即使是Microsoft也不在类库中提供app.config的原因

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

但如果您仍想访问,请尝试此选项
1.将对System.Configuration.dll的引用添加到类库中,并在using块中添加using System.Configuration
二,。编写代码以将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();
    }
string getFilePath()
{
字符串路径=path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase)+@“\ClassLibrary.dll.config”;
XDocument doc=XDocument.Load(路径);
var query=doc.substands(“appSettings”).Nodes().Cast().Where(x=>x.Attribute(“key”).Value.ToString()==key.FirstOrDefault();
if(查询!=null)
{
返回query.Attribute(“value”).value.ToString();
}

您不应该在类库中的任何设置中使用app.config。这样做是不好的做法,这也是Microsoft在类库中不提供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();
    }
string getFilePath()
{
字符串路径=path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase)+@“\ClassLibrary.dll.config”;
XDocument doc=XDocument.Load(路径);
var query=doc.substands(“appSettings”).Nodes().Cast().Where(x=>x.Attribute(“key”).Value.ToString()==key.FirstOrDefault();
if(查询!=null)
{
返回query.Attribute(“value”).value.ToString();
}

我在问题中没有看到任何暗示在中编译该文件的内容?听起来像是文件刚从一个项目移动到另一个项目,除非我误解了。更准确地说,配置值是从启动项目的配置文件中读取的,而不是任何依赖项。@BrootsWaymb-我是在他从项目中删除app.config时读取的ect,也许我误读了too@stuartd-我认为这可能是问题的关键。我们没有被告知与exe和dll的关系,也没有被告知dll在什么情况下试图访问配置,但如果是exe>dll>config,那就可以解释了。@RJN-可能会帮助您更好地理解,而不是我在comme中解释的ntsI在问题中没有看到任何暗示在中编译该文件的内容?听起来好像该文件刚从一个项目移动到另一个项目,除非我误解了。更准确地说,配置值是从启动项目的配置文件中读取的,而不是从任何依赖项中读取的。@BrootsWaymb-我在他从项目中删除app.config时读取的,也许我误读了too@stuartd-我认为这可能是问题的关键。我们没有被告知与exe和dll的关系,也没有被告知dll在什么条件下试图访问配置,但如果是exe>dll>config,那就可以解释了。@RJN-可能会帮助您更好地理解,而不是我在评论中解释的o exe是否引用dll,而您正试图让dll读取配置?是的。但实际上,我无法控制exe,因为它是由其他人创建的,而我们是dll提供程序。在这种情况下,为了维护设置,除了让App.config与DLLSo一起使用外,我没有其他方法。o exe是否引用dll,而您正试图e dll读取配置?是的。但实际上,我无法控制EXE,因为它是由其他人创建的,而我们是dll提供程序。在这种情况下,为了维护设置,除了让App.config与DLLmine一起使用是dll项目,我无法控制EXE,所以我没有其他选项来存储许多设置。@RJN-好,开始你可以试试上面提到的一个选项,看看它是否能得到你想要的结果。我的是DLL项目,我对EXE没有控制权,所以我没有其他选项来存储许多设置。@RJN-好的,知道了。你可以试试上面提到的一个选项,看看它是否能得到你想要的结果。