2009-04-27 36 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); 
相關問題