Bagaimana menemukan jalur file app.config aktif?

167

Saya mencoba menyelesaikan penangan pengecualian ini:

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

Masalah ini sepertinya hanya terjadi pada saya ketika saya menggunakan nUnit.

MatthewMartin
sumber

Jawaban:

363

Coba ini

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Semoga ini bisa membantu

Cédric Rup
sumber
Ini jauh lebih baik daripada mencoba menggunakan Assembly.GetEntryAssembly () + ".config" yang tidak berfungsi dalam beberapa situasi di ASP.NET dan dalam beberapa situasi saat menggunakan AppDomains.
Contango
4
bagaimana saya bisa mengubah jalur ini?
Vignesh Subramanian
Terima kasih. Saya memiliki proyek yang ditingkatkan dari VS2008 -> VS2013 yang menolak untuk membaca file app.config. Kemudian saya belajar melalui AppDomain.CurrentDomain.SetupInformation.ConfigurationFile bahwa ia sedang mencari XXX.vshost.exe.config yang tidak dihasilkan. Jadi saya mematikannya VS Hosting di tab debug properti proyek. Kemudian saya harus mengubah nama file app.config saya menjadi {projectName} .config, taruh di folder bin dan akhirnya berhasil
drzounds
1
Tidak bekerja untuk saya. Namun jawaban ini berhasil .
Kay Zed
4
Bagaimana dengan .net core?
jjxtra
64

Sebenarnya, tidak ada file konfigurasi tunggal. Tidak termasuk ASP.NET 1 dapat ada tiga file konfigurasi menggunakan dukungan inbuilt ( System.Configuration). Selain konfigurasi mesin:, app.exe.configpengguna roaming, dan pengguna lokal.

Untuk mendapatkan konfigurasi "global" ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Gunakan ConfigurationUserLevelnilai yang berbeda untuk file konfigurasi roaming dan non-roaming per penggunaan.


1 Yang memiliki model yang sama sekali berbeda di mana konten folder anak (IIS-virtual atau sistem file) web.configdapat (tergantung pada pengaturan) menambah atau menimpa orangtua web.config.

Richard
sumber
2
Saya pertama kali menaikkan "Jawaban", yang sangat membantu. Tetapi pada akhirnya saya benar-benar membutuhkan pendekatan ini, jadi terima kasih telah meletakkannya di sini juga.
Noam Gal
Jangan lupa untuk menambahkan referensi ke System.configuration
Black Horus
9

Jika Anda maksudnya Anda hanya mendapatkan pengembalian nol ketika Anda menggunakan NUnit, maka Anda mungkin perlu menyalin nilai ConnectionString app.config aplikasi Anda ke app.config perpustakaan tes Anda.

Ketika dijalankan oleh loader tes, unit uji dimuat saat runtime dan akan mencari di app.config sendiri (diganti namanya menjadi testAssembly.dll.config pada waktu kompilasi) daripada aplikasi Anda mengkonfigurasi file.

Untuk mendapatkan lokasi perakitan yang Anda jalankan, coba

System.Reflection.Assembly.GetExecutingAssembly().Location
Colin Desmond
sumber
1
Sarankan "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" dari @Cedric Rup, jika tidak, Anda akan mendapatkan pengecualian dalam beberapa situasi di ASP.NET dan dalam beberapa situasi saat menggunakan AppDomains.
Contango
6

Pastikan Anda mengklik properti pada file dan mengaturnya untuk "salin selalu" atau itu tidak akan berada di folder Debug \ dengan dll bahagia lil Anda untuk mengkonfigurasi di mana perlu dan menambahkan lebih banyak cowbell

Chad Grant
sumber
6

Pertama kali saya menyadari bahwa proyek pengujian Unit mereferensikan app.config dalam proyek itu daripada app.config yang terkait dengan proyek kode produksi saya (tentu saja, DOH) Saya baru saja menambahkan baris dalam Acara Pasca Bangun proyek Prod. yang akan menyalin app.config ke folder bin proyek uji.

Masalah terpecahkan

Saya belum melihat adanya efek samping yang aneh sejauh ini, tetapi saya tidak yakin bahwa ini adalah solusi yang tepat, tetapi setidaknya tampaknya berhasil.

Kasper
sumber
4

Satu lagi opsi yang saya lihat tidak ada di sini:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
selalerer
sumber
Hal yang menyenangkan tentang ini, seperti kelihatannya, adalah mengkompilasi di bawah .NET Standard 2.0 Ini mengembalikan nol di bawah .NET Core 2.0, tapi ini berguna selama migrasi.
EM0
3

Tergantung pada lokasi file konfigurasi Anda System.Reflection.Assembly.GetExecutingAssembly().Locationmungkin melakukan apa yang Anda butuhkan.

William Edmondson
sumber
2
Selain itu, Anda dapat memiliki beberapa file konfigurasi "aktif" secara bersamaan. Machine.config, web.config tingkat kerangka kerja, konfigurasi tingkat aplikasi, dll ... jadi saya tidak berpikir ada cara untuk secara otomatis menemukan lokasi file string koneksi unik tanpa memilah-milah semua file konfigurasi yang mungkin tersedia untuk aplikasi Anda.
William Edmondson
3

Saya mencoba salah satu jawaban sebelumnya di aplikasi web (sebenarnya peran web Azure berjalan secara lokal) dan itu tidak berhasil. Namun, pendekatan serupa ini berhasil:

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

File config ternyata berada di C: \ Program Files \ IIS Express \ MyComponent.dll.config. Tempat menarik untuk itu.

RedGreenCode
sumber