2009-04-27 125 views
144

我试图完成这个异常处理程序:如何找到活动的app.config文件的路径?

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只发生在我身上。

回答

315

试试这个

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 

希望它可以帮助

+0

这比使用Assembly.GetEntryAssembly()+“.config”更好,这在ASP.NET的某些情况下不起作用,并且在某些情况下在使用AppDomains时不起作用。 – Contango 2013-10-08 13:27:22

+3

我该如何改变这条道路? – 2015-05-06 13:59:18

+0

谢谢。我有一个项目从VS2008升级 - > VS2013拒绝读取app.config文件。然后,我通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFile了解到它正在搜索未生成的XXX.vshost.exe.config。所以我把它关闭VS主机在项目属性调试选项卡。然后,我不得不将我的app.config文件重命名为{projectName} .config,并将其放入bin文件夹,并最终生效 – drzounds 2016-06-29 19:50:07

8

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

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

为了得到你正在运行的程序集的位置,尽量

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

推荐“AppDomain.CurrentDomain.SetupInformation.ConfigurationFile”从@Cedric RUP否则你将得到在ASP.NET以及在某些情况下,一些例外使用AppDomains时的情况。 – Contango 2013-10-08 13:29:14

3

根据您的配置文件System.Reflection.Assembly.GetExecutingAssembly().Location的位置可能会做你的需要。

+2

此外,您可以同时拥有多个“活动”配置文件。 Machine.config,框架级别web.config,应用程序级别配置等...所以我不认为有一种方法可以自动找到唯一的连接字符串文件位置,而无需解析所有可用的配置文件可用于您的应用程序。 – 2009-04-27 14:16:56

5

确保您单击该文件的属性,并将其设置为“复制总是”或它不会与你的幸福调试\文件夹律DLL将配置它需要的地方,并添加更多的牛铃

58

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

获得 “全球” 配置(EXE的.config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
        .FilePath 

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


其中有一个完全不同的模型,其中一个子文件夹(IIS虚拟或文件系统)web.config可以(根据设置)的内容添加到或覆盖父的web.config

6

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

问题解决

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

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中。它有趣的地方。

3

一个,我看到了更多选项缺少在这里:

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