SORU
27 Mayıs 2011, Cuma


Varsayılan uygulama değiştirmek.config zamanında

Ben şu sorun var:
Yük modülleri bir uygulama (eklenti) var. Bu modüller app girişleri gerekebilir.config (örn: XML yapılandırma). Modüller dinamik olarak yüklenmiş olduğundan, uygulamada bu girdileri istemiyorum.benim uygulama yapılandırma dosyası.
Yapmak istediğim şey şudur:

  • Yeni bir uygulama oluşturun.modüllerden config bölümleri içeren bellek yapılandırma
  • Benim uygulama bu yeni uygulamayı kullanmak için söyle.config

Not: Varsayılan uygulaması üzerine yazmak istemiyorum.config!

Örneğin ConfigurationManager.AppSettings yeni bir dosya kullanır böylece şeffaf bir şekilde çalışması gerektiğini.

Bu sorun benim değerlendirme sırasında, burada sağlanan aynı çözüm buldum: Reload app.config with nunit.
Ne yazık ki, hala normal uygulama verileri al çünkü bir şey yapmak için görünmüyor, değil mi.config.

Bu kodu test etmek için kullandım

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

combinedConfig normal app dışında değerler içeriyor, ancak aynı değerleri twices yazdırır.config.

CEVAP
27 Mayıs 2011, Cuma


Eğer yapılandırma sistemi ilk kez kullanılmadan önce kullanılırsa hack bağlantılı soru çalışır. Bundan sonra, artık işe yaramıyor.
Sebebi:
Önbelleğe yolları bir sınıf ClientConfigPaths var. Yani, SetData ile bile yolunu değiştirdikten sonra zaten önbelleğe alınan değerleri yok çünkü yeniden okumak değil. Çözüm bu da kaldırmak için:

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

Kullanımı şöyledir:

// the default app.config is used.
using(AppConfig.Change(tempFileName))
{
    // the app.config in tempFileName is used
}
// the default app.config is used.

Kullanılan uygulamayı değiştirmek istiyorsanız.uygulama tüm çalışma için yapılandırma basit bir uygulama başlangıcında kullanmadan AppConfig.Change(tempFileName) koy.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Engadget

    Engadget

    18 EYLÜL 2006
  • o0oCyrusViruso0o

    o0oCyrusViru

    11 Mart 2008
  • WHZGUD2

    WHZGUD2

    21 EYLÜL 2011