在我的WAP项目中,我引用了另一个C#项目(非Web)。在那个C#项目中,我有一个app.config,我将其重命名为[projectName] .config
然后我尝试从我的[Project] .config中获取一个来自我的C#项目中的一些代码的密钥,它找不到它:
return ConfigurationManager.AppSettings["somekey"]
所以我想知道为什么它无法读取我的app.config。我认为ConfigurationManager能够从Web项目的web.config和我的[projectName] .config(app.config)文件中读取密钥吗?
答案 0 :(得分:7)
ConfigurationManager将读取the configuration of the application's host。在您的情况下,Web应用程序是应用程序的主机 - 因此,调用ConfigurationManager将从您的web.config中读取 - 即使您从引用的dll调用ConfigurationManager。
如果您的Web应用程序引用了一个dll,那么该DLL应该从web.config获取其配置。这是应用程序的最佳选择。如果dll由多种类型的应用程序引用,则配置中的设置可能需要不同。
答案 1 :(得分:5)
尝试将其放入web.config中:
<appSettings file="externalSettings.config"/>
externalSettings.config是您要使用的其他配置文件。
对于非Web程序集,它会查找AssemblyName.dll,其中AssemblyName对应于程序集名称。例如:如果您的程序集名称为Com.MyProject.Library1.dll
,那么它正在查找的配置文件是Com.MyProject.Library1.dll.config
。
更新:
我对此进行了更多的研究,如上所述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和类库之间共享“通用”配置参数,那就是这样做的。
答案 2 :(得分:1)
始终从执行程序集中读取配置。
所以你应该把所需的设置放到正确的* .config文件中。对于需要编辑此文件的每个人来说都很容易。
答案 3 :(得分:0)
如上所述,您不应该更改您的应用程序.config filename,这不会产生任何影响。原因是默认情况下,编译器将App.config内容复制到Debug [AppName] .exe.config中。然后,当加载应用程序时,.NET CLR会将[AppName] .exe.config中的数据加载到内存中,然后再不会将其触及。
答案 4 :(得分:0)
这里有两种可能性:
首先,如Visual Studio项目中所述here,将.config文件放在项目目录中,并将其“复制到输出目录”属性设置为“始终复制”或“如果更新则复制”。 Visual Studio会自动将文件复制到编译程序集的目录。
您使用ConfigurationManager::OpenExeConfiguration
方法显式加载配置的第二种可能性(更多关于它here)。
答案 5 :(得分: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