Etkin app.config dosyasının yolu nasıl bulunur?


167

Bu özel durum işleyicisini bitirmeye çalışıyorum:

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);
}

Bu sorun bana sadece nUnit kullandığımda oluyor gibi görünüyor.

Yanıtlar:


363

Bunu dene

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Umarım yardımcı olur


Bu, ASP.NET'teki bazı durumlarda ve AppDomains kullanırken bazı durumlarda çalışmayan Assembly.GetEntryAssembly () + ".config" komutunu kullanmaya çalışmaktan daha iyi bir yoldur.
Contango

4
bu yolu nasıl değiştirebilirim?
Vignesh Subramanian

Teşekkür ederim. Ben app.config dosyasını okumayı reddetti VS2008 -> VS2013 yükseltilmiş bir proje vardı. Sonra AppDomain.CurrentDomain.SetupInformation.ConfigurationFile üzerinden oluşturulan XXX.vshost.exe.config aradığını öğrendim. Bu yüzden proje özellikleri hata ayıklama sekmesinde VS Hosting kapatıldı. Sonra app.config dosyamı {projectName} .config olarak yeniden adlandırmak, bin klasörüne koymak zorunda
kaldım

1
Benim için çalışmadı. Ancak bu cevap geldi .
Kay Zed

4
.Net core nedir?
jjxtra

64

Kesinlikle tek bir yapılandırma dosyası yoktur. ASP.NET 1 hariç , inbuilt ( System.Configuration) desteğini kullanan üç yapılandırma dosyası olabilir . Makine yapılandırmasına ek olarak:, app.exe.configkullanıcı dolaşımı ve yerel kullanıcı.

"Global" yapılandırmayı almak için ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Kullanım ConfigurationUserLevelbaşına dolaşım ve dolaşım dışı yapılandırma dosyaları için farklı değerler kullanın .


1 Alt klasörlerin (IIS-sanal veya dosya sistemi) içeriğinin ( web.configayara bağlı olarak) üst öğeye eklenebileceği veya geçersiz kılınabileceği tamamen farklı bir modeli vardır web.config.


2
Önce çok yardımcı oldu "Cevap", upped. Ama sonunda bu yaklaşıma gerçekten ihtiyacım vardı, bu yüzden buraya da eklediğiniz için teşekkürler.
Noam Gal

System.configuration'a bir referans eklemeyi unutmayın
Black Horus

9

Yalnızca NUnit'i kullandığınızda boş bir geri dönüş aldığınızı kastediyorsanız, muhtemelen ConnectionString değerini uygulamanızın app.config'sini test kitaplığınızın app.config dosyasına kopyalamanız gerekir.

Test yükleyicisi tarafından çalıştırıldığında, test derlemesi çalışma zamanında yüklenir ve uygulama yapılandırma dosyanız yerine kendi app.config dosyasına (derleme zamanında testAssembly.dll.config olarak yeniden adlandırılır) bakar.

Çalıştırdığınız montajın yerini almak için şunu deneyin:

System.Reflection.Assembly.GetExecutingAssembly().Location

1
@Cedric Rup'den "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" öner, aksi takdirde ASP.NET'teki bazı durumlarda ve AppDomains kullanırken bazı durumlarda bir istisna alırsınız.
Contango

6

Dosyadaki özellikleri tıkladığınızdan ve "her zaman kopyala" olarak ayarladığınızdan emin olun, yoksa nerede olması gerektiğini yapılandırmak ve daha fazla zil eklemek için mutlu lil dll'lerinizle Debug \ klasöründe olmayacaktır.


6

Birim test projesinin, üretim kodu projemle (app off, DOH) ilişkili app.config yerine o uygulamada app.config'e başvurduğunu ilk kez anladığım zaman Prod projesinin Post Build Etkinliğine bir satır ekledim app.config dosyasını test projesinin bin klasörüne kopyalar.

Sorun çözüldü

Şimdiye kadar garip bir yan etki fark etmedim, ancak bunun doğru çözüm olduğundan emin değilim, ama en azından işe yarıyor gibi görünüyor.


4

Burada gördüğüm bir seçenek daha eksik:

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

Bu konuda güzel olan şey, göründüğü gibi, .NET Standard 2.0 altında derlemesidir. .NET Core 2.0 altında null döndürür, ancak taşıma sırasında kullanışlıdır.
EM0

3

Yapılandırma dosyanızın konumuna bağlı olarak System.Reflection.Assembly.GetExecutingAssembly().Locationihtiyacınız olanı yapabilirsiniz.


2
Ayrıca, aynı anda birkaç "etkin" yapılandırma dosyanız olabilir. Machine.config, framework level web.config, app level config, vb ... bu yüzden uygulamanız için mevcut olan tüm olası yapılandırma dosyalarını ayrıştırmadan benzersiz bir bağlantı dizesi dosyası konumunu otomatik olarak bulmanın bir yolu olduğunu düşünmüyorum.
William Edmondson

3

Bir web uygulamasında önceki yanıtlardan birini denedim (aslında yerel olarak çalışan bir Azure web rolü) ve oldukça işe yaramadı. Ancak, bu benzer yaklaşım işe yaradı:

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

Yapılandırma dosyasının C: \ Program Files \ IIS Express \ MyComponent.dll.config içinde olduğu ortaya çıktı. Bunun için ilginç bir yer.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.