Ubah suai app.config lalai secara dinamik semasa masa jalan
Penerangan masalah:
Bangunkan penyelesaian yang memuatkan bahagian konfigurasi secara dinamik daripada modul aplikasi yang dimuatkan secara dinamik ke dalam app.config dalam memori baharu, memastikan aplikasi menggunakan konfigurasi yang diubah suai secara telus tanpa menulis ganti konfigurasi lalai.
Penyelesaian:
Soalan berkaitan mencadangkan menggunakan kaedah SetData
untuk menukar laluan sistem konfigurasi, tetapi ini hanya berkesan apabila dilaksanakan sebelum sistem konfigurasi digunakan buat kali pertama. Untuk menyelesaikan isu ini sepenuhnya, nilai konfigurasi cache juga perlu dikosongkan.
Pelaksanaan:
Kod berikut menunjukkan cara untuk mencapai tingkah laku yang diingini:
<code class="language-csharp">using System; using System.Configuration; using System.Linq; using System.Reflection; public abstract class AppConfig : IDisposable { public static AppConfig Change(string path) { return new ChangeAppConfig(path); } public abstract void Dispose(); private class ChangeAppConfig : AppConfig { private readonly string oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); private bool disposedValue; public ChangeAppConfig(string path) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); ResetConfigMechanism(); } public override void Dispose() { if (!disposedValue) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); ResetConfigMechanism(); disposedValue = true; } GC.SuppressFinalize(this); } private static void ResetConfigMechanism() { typeof(ConfigurationManager) .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, 0); typeof(ConfigurationManager) .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); typeof(ConfigurationManager) .Assembly.GetTypes() .Where(x => x.FullName == "System.Configuration.ClientConfigPaths") .First() .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); } } }</code>
Penggunaan:
Untuk mengubah suai app.config buat sementara waktu untuk skop tertentu:
<code class="language-csharp">using (AppConfig.Change(tempFileName)) { // 应用程序使用修改后的 app.config }</code>
Untuk menukar app.config secara kekal untuk keseluruhan masa jalan:
<code class="language-csharp">// 应用程序使用修改后的 app.config AppConfig.Change(tempFileName);</code>
Atas ialah kandungan terperinci Bagaimana cara mengubahsuai app.config secara dinamik pada masa runtime?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!