2010-01-29 76 views
4

在我的WAP项目中,我引用了另一个C#项目(非Web)。在那个C#项目中,我有一个app.config,并将其重命名为[projectName] .config无法从App.Config中检索密钥

然后我尝试从我的C#项目中的某些代码的[project] .config中获取一个密钥,找到它︰

return ConfigurationManager.AppSettings["somekey"] 

所以我想知道为什么它不能读取我的app.config。我认为ConfigurationManager能够读取我项目中Web项目的web.config和我的[projectName] .config(app.config)文件的键值?

+0

贵“somekey”是介于两者之间在您的项目.config文件? – 2010-01-29 21:59:39

+1

是一个名为'project.config'或者'project.exe'应用程序旁边的'project.exe.config'文件吗?你真的不应该重命名app.config,因为它在编译时会自动更名为project.exe.config ..... – 2010-01-30 09:43:12

+0

已将我的文件更改回app.config。重新编译我的C#项目(即我的Web项目引用),仍然在我的.aspx的代码隐藏中,它无法从我引用的项目的app.config – PositiveGuy 2010-02-01 03:50:07

回答

6

ConfigurationManager将读取the configuration of the application's host。在你的情况下,Web应用程序是应用程序的主机 - 因此,调用ConfigurationManager将从web.config读取 - 即使您从引用的dll调用ConfigurationManager。

如果您的Web应用程序引用了dll,那么该dll应该从web.config中获取它的配置。这对于应用程序来说是最好的。如果dll被多种类型的应用程序引用,配置中的设置可能需要不同。

5

尝试把这个在你的web.config:

<appSettings file="externalSettings.config"/> 

externalSettings.config是您要使用其他配置文件。

对于非web程序集,它查找AssemblyName.dll,其中AssemblyName对应于程序集名称。例如:如果你的程序集名称是Com.MyProject.Library1.dll,那么它正在寻找的配置文件是Com.MyProject.Library1.dll.config

UPDATE: 我做了这方面的一些更多的研究,并且指出here“ConfigurationManager中会从被加载的AppDomain时加载的应用程序的配置文件中读取”。因此,如果您的web应用程序是从aspx代码中访问ConfigurationManager,它将从web.config文件读取。

我认为最合适的解决方法就是我已经提供的解决方法,即使用appSettings配置参数,该参数允许您为aspx应用程序和类库创建共享配置文件。

举个例子,在你共享的配置文件,你会想是这样的:

<appSettings> 
    <add key="Key1" value="test"/> 
</appSettings> 

比方说,这个文件是c:\temp\shared.config。然后在你的web.config文件,你可以参考这样的:

<appSettings file="C:\\temp\\shared.config"></appSettings> 

你会把这同一线上的类库的App.config中。

现在你就可以使用:

ConfigurationManager.AppSettings["Key1"] 

从您的aspx应用或类库,你会得到的值。

因此,如果您确实需要在aspx和类库中共享的“通用”配置参数,则可以这样做。

+0

中读取该配置项。我认为自从我将其他程序集引用到我的web项目,它可以自动找到该配置文件。也许是因为我改名了? – PositiveGuy 2010-01-29 22:02:55

+0

很可能,是的。我最初的回应(我删除了)是它查找AssemblyName.dll.config(其中AssemblyName是非web项目程序集的名称)。所以如果你重命名它,它将无法找到它。但是我认为,如果您出于某种原因想要使用不同的名称,上述解决方案也是一个很好的解决方案。 – dcp 2010-01-29 22:05:07

1

配置总是从执行程序集中读取。

因此,您应该将所需的设置放在适当的* .config文件中。对于需要编辑此文件的每个人来说,这将非常简单。

0

如上所述,您不应该更改您的应用程序.config文件名,这不会产生任何效果。原因在于,默认情况下,编译器将App.config内容复制到Debug [AppName] .exe.config中。然后,在加载应用程序时,.NET CLR会将[AppName] .exe.config中的数据加载到内存中,然后永远不会触及它。

0

有两种可能的位置:

首先,注意到在Visual Studio项目here,将config文件在项目目录,并将其复制到输出目录属性始终复制或是否有更新的复制。 Visual Studio自动将文件复制到编译程序集的目录中。

第二种可能性是(更多关于它here)您明确地使用ConfigurationManager::OpenExeConfiguration方法加载配置。

0

这将加载bin目录中的任何* .config文件。

public Configuration DllConfiguration(string filename) 
{ 
    var map = new ExeConfigurationFileMap { 
     ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename) 
    }; 

    return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
} 

有关于每个DLL .config文件在顶部的设计问题投票的回答这个问题一个很好的讨论C# DLL config file