5

標準の.Net ConfigurationManager クラスを別のファイルにリダイレクトしようとしています。完全に。パスは実行時に決定されるため、configSourceなどを使用できません(これは重複した質問ではありません-他のものを見てきました)。

私は基本的に、ASP.Net が裏で行っていることを再現しようとしています。したがって、私のクラスは新しい構成ファイルから読み取るだけでなく、標準の .Net のものも読み取る必要があります (私が具体的に動作させようとしているのは system.codeDom 要素です)。

私はReflectorを開いて、ASP.Netがどのようにそれを行うかを調べ始めました.それはかなり毛むくじゃらで、完全に文書化されていません. 他の誰かがプロセスをリバースエンジニアリングしたことを願っていました。必ずしも完全な解決策を探しているわけではありません (いいでしょう)

4

1 に答える 1

9

私はついにそれを理解しました。これを行うための公開された文書化された手段がありますが、それは.Netフレームワークの奥深くに隠されています。独自の構成ファイルを変更するには、リフレクションが必要です(ConfigurationManagerを更新するだけです)。ただし、パブリックAPIを介して作成したAppDomainの構成ファイルを変更することは可能です。

私が提出したMicrosoftConnect機能のおかげで、コードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        // Setup information for the new appdomain.
        AppDomainSetup setup = new AppDomainSetup();
        setup.ConfigurationFile = "C:\\my.config";

        // Create the new appdomain with the new config.
        AppDomain d2 = AppDomain.CreateDomain("customDomain", AppDomain.CurrentDomain.Evidence, setup);

        // Call the write config method in that appdomain.
        CrossAppDomainDelegate del = new CrossAppDomainDelegate(WriteConfig);
        d2.DoCallBack(del);

        // Call the write config in our appdomain.
        WriteConfig();

        Console.ReadLine();
    }

    static void WriteConfig()
    {
        // Get our config file.
        Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        // Write it out.
        Console.WriteLine("{0}: {1}", AppDomain.CurrentDomain.FriendlyName, c.FilePath);
    }
}

出力:

customDomain: C:\my.config
InternalConfigTest.vshost.exe: D:\Profile\...\InternalConfigTest.vshost.exe.config
于 2009-08-13T09:37:42.597 に答える