如何找到活动的app.config文件的路径?


167

我正在尝试完成此异常处理程序:

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
    string pathOfActiveConfigFile = ...?
    throw new ConfigurationErrorsException(
       "You either forgot to set the connection string, or " +
       "you're using a unit test framework that looks for  "+
       "the config file in strange places, update this file : " 
       + pathOfActiveConfigFile);
}

这个问题似乎仅在我使用nUnit时发生。

Answers:


363

试试这个

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

希望能帮助到你


这比尝试使用Assembly.GetEntryAssembly()+“ .config”更好,这在ASP.NET中的某些情况下以及使用AppDomains的某些情况下不起作用。
康坦戈

4
我该如何改变这条道路?
Vignesh Subramanian

谢谢。我有一个从VS2008-> VS2013升级的项目,该项目拒绝读取app.config文件。然后,我通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFile得知它正在搜索未生成的XXX.vshost.exe.config。因此,我在项目属性的“调试”选项卡中关闭了“ VS主机”。然后,我不得不将我的app.config文件重命名为{projectName} .config,将其放在bin文件夹中,然后终于可以了
drzounds

1
没为我工作。 但是,这个答案确实有
凯·泽德

4
.net核心呢?
jjxtra

64

严格来说,没有单个配置文件。除ASP.NET 1外,使用内置(System.Configuration)支持可以有三个配置文件。除了计算机config:,app.exe.config用户漫游和本地用户。

要获取“全局”配置(exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

ConfigurationUserLevel对按使用的漫游和非漫游配置文件使用不同的值。


1具有完全不同的模型,子文件夹(IIS虚拟或文件系统)的内容web.config可以(取决于设置)添加或覆盖父文件夹的内容web.config


2
我首先调高了“答案”,这非常有帮助。但是最后,我确实需要这种方法,因此也感谢您将其放在此处。
Noam Gal 2010年

不要忘记添加对System.configuration的引用
Black Horus

9

如果您的意思是使用NUnit时只得到空返回值,那么您可能需要将ConnectionString值复制到应用程序的app.config中到您的测试库的app.config中。

当它由测试加载程序运行时,测试程序集将在运行时加载,并将查找其自己的app.config(在编译时重命名为testAssembly.dll.config),而不是您的应用程序配置文件。

要获取您正在运行的程序集的位置,请尝试

System.Reflection.Assembly.GetExecutingAssembly().Location

1
从@Cedric Rup建议“ AppDomain.CurrentDomain.SetupInformation.ConfigurationFile”,否则在ASP.NET中的某些情况下以及使用AppDomains的某些情况下,您将获得异常。
康坦戈

6

确保单击文件上的属性并将其设置为“始终复制”,否则它不会与您的快乐lil dll一起位于Debug \文件夹中,以配置需要放置的位置并添加更多的母牛


6

我第一次意识到单元测试项目引用了该项目中的app.config,而不是与我的生产代码项目关联的app.config(当然,DOH),我只是在Prod项目的Post Build Event中添加了一行会将app.config复制到测试项目的bin文件夹中。

问题解决了

到目前为止,我还没有发现任何怪异的副作用,但是我不确定这是否是正确的解决方案,但至少它似乎有效。


4

我看到的另一个选项在这里缺失:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);

关于它的好处,看起来很怪异,是它可以在.NET Standard 2.0下编译。在.NET Core 2.0下,它返回null,但是在迁移过程中很有用。
EM0

3

根据您的配置文件的位置,System.Reflection.Assembly.GetExecutingAssembly().Location可能需要做些什么。


2
此外,您可以同时具有多个“活动”配置文件。Machine.config,框架级别的web.config,应用程序级别的配置等...因此,我认为没有一种方法可以自动定位唯一的连接字符串文件位置,而无需解析应用程序可用的所有可能的配置文件。
威廉·埃德蒙森(Edmondson)

3

我在Web应用程序(实际上是在本地运行的Azure Web角色)中尝试了以前的答案之一,但效果不佳。但是,这种类似的方法确实起作用:

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;

该配置文件原来位于C:\ Program Files \ IIS Express \ MyComponent.dll.config中。有趣的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.