Saya memiliki masalah berikut:
Kami memiliki aplikasi yang memuat modul (tambahan). Modul-modul ini mungkin memerlukan entri di app.config (mis. Konfigurasi WCF). Karena modul dimuat secara dinamis, saya tidak ingin memiliki entri ini di file app.config aplikasi saya.
Yang ingin saya lakukan adalah sebagai berikut:
- Buat app.config baru dalam memori yang menggabungkan bagian konfigurasi dari modul
- Beri tahu aplikasi saya untuk menggunakan app.config baru itu
Catatan: Saya tidak ingin menimpa app.config default!
Ini harus bekerja secara transparan, sehingga misalnya ConfigurationManager.AppSettings
menggunakan file baru itu.
Selama evaluasi masalah ini, saya datang dengan solusi yang sama seperti yang disediakan di sini: Muat ulang app.config dengan nunit .
Sayangnya, sepertinya tidak melakukan apa-apa, karena saya masih mendapatkan data dari app.config yang normal.
Saya menggunakan kode ini untuk mengujinya:
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
var combinedConfig = string.Format(CONFIG2, CONFIG);
var tempFileName = Path.GetTempFileName();
using (var writer = new StreamWriter(tempFileName))
{
writer.Write(combinedConfig);
}
using(AppConfig.Change(tempFileName))
{
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
}
Ini mencetak nilai yang sama dua kali lipat, meskipun combinedConfig
berisi nilai-nilai selain app.config yang normal.
sumber
AppDomain
dengan file konfigurasi yang sesuai bukan merupakan pilihan?Reload app.config with nunit
dapat berfungsi, tidak yakin, jika digunakan pada entri aplikasi sebelum konfigurasi apa pun dimuat.Jawaban:
Retasan dalam pertanyaan terkait berfungsi jika digunakan sebelum sistem konfigurasi digunakan pertama kali. Setelah itu, tidak berfungsi lagi.
Alasannya:
Ada kelas
ClientConfigPaths
yang cache jalur. Jadi, bahkan setelah mengubah lintasan denganSetData
, itu tidak dibaca kembali, karena sudah ada nilai-nilai yang di-cache. Solusinya adalah menghapus ini juga:Penggunaannya seperti ini:
Jika Anda ingin mengubah app.config yang digunakan untuk seluruh runtime aplikasi Anda, cukup masukkan
AppConfig.Change(tempFileName)
tanpa menggunakan suatu tempat di awal aplikasi Anda.sumber
Anda dapat mencoba menggunakan Configuration dan Add ConfigurationSection saat runtime
EDIT: Ini adalah solusi berdasarkan refleksi (meskipun tidak terlalu bagus)
Buat kelas yang berasal dari
IInternalConfigSystem
lalu melalui refleksi set ke bidang pribadi di
ConfigurationManager
sumber
file_path
. Ini tidak akan membuat bagian tersedia untuk penggunaConfigurationManager.GetSection
, karenaGetSection
menggunakan app.config default.Solusi @aniel bekerja dengan baik. Solusi serupa dengan penjelasan lebih lanjut ada di sudut c-sharp. Untuk kelengkapan, saya ingin membagikan versi saya: dengan
using
, dan bendera bit disingkat.sumber
Jika ada yang tertarik, inilah metode yang bisa digunakan pada Mono.
sumber
Solusi Daniel tampaknya berfungsi bahkan untuk majelis hilir yang pernah saya gunakan AppDomain.SetData sebelumnya, tetapi tidak mengetahui cara mengatur ulang flag konfigurasi internal
Dikonversi ke C ++ / CLI untuk mereka yang tertarik
sumber
Jika file konfigurasi Anda hanya ditulis dengan kunci / nilai di "pengaturan aplikasi", maka Anda dapat membaca file lain dengan kode seperti itu:
Kemudian Anda bisa membaca bagian. Pengaturan sebagai kumpulan KeyValueConfigurationElement.
sumber
ConfigurationManager.GetSection
membaca file baru yang saya buat. Solusi Anda tidak melakukan itu.ConfigurationManager.GetSection
menggunakan app.config default. Tidak peduli dengan file konfigurasi yang Anda bukaOpenMappedExeConfiguration
.Diskusi yang luar biasa, saya telah menambahkan lebih banyak komentar ke metode ResetConfigMechanism untuk memahami keajaiban di balik pernyataan / panggilan dalam metode tersebut. Juga ditambahkan path file cek
sumber
Daniel, jika mungkin coba gunakan mekanisme konfigurasi lainnya. Kami telah melalui rute ini di mana kami memiliki file konfigurasi statis / dinamis yang berbeda tergantung pada lingkungan / profil / grup dan itu menjadi sangat berantakan pada akhirnya.
Anda dapat mencoba semacam WebService Profil di mana Anda hanya menentukan satu URL Layanan Web dari klien dan tergantung pada detail Klien (Anda mungkin memiliki tingkat tingkat Grup / Pengguna), itu memuat semua konfigurasi yang dibutuhkan. Kami juga telah menggunakan MS Enterprise Library untuk sebagiannya.
itu adalah Anda tidak menggunakan konfigurasi dengan klien Anda dan Anda dapat mengelolanya secara terpisah dari klien Anda
sumber