6

構成ファイルを読み取るアセンブリ (DLL) をロードしています。構成ファイルを変更してから、アセンブリを再ロードする必要があります。アセンブリを 2 回目にロードした後、構成に変更がないことがわかります。ここで何が悪いのか誰にもわかりますか?構成ファイルの読み取りの詳細は省きました。

AppDomain subDomain;
string assemblyName = "mycli";
string DomainName = "subdomain"; 
Type myType;
Object myObject;

// Load Application domain + Assembly
subDomain = AppDomain.CreateDomain( DomainName,
                                    null,
                                    AppDomain.CurrentDomain.BaseDirectory,
                                    "",
                                    false);

myType = myAssembly.GetType(assemblyName + ".mycli");
myObject = myAssembly.CreateInstance(assemblyName + ".mycli", false, BindingFlags.CreateInstance, null, Params, null, null);

// Invoke Assembly
object[] Params = new object[1];
Params[0] = value;
myType.InvokeMember("myMethod", BindingFlags.InvokeMethod, null, myObject, Params);

// unload Application Domain
AppDomain.Unload(subDomain);

// Modify configuration file: when the assembly loads, this configuration file is read in

// ReLoad Application domain + Assembly
// we should now see the changes made in the configuration file mentioned above

4

3 に答える 3

12

一度読み込まれたアセンブリをアンロードすることはできません。ただし、AppDomain をアンロードできるため、ロジックを別の AppDomain にロードし、アセンブリを再ロードする場合は、AppDomain をアンロードしてから再ロードする必要があります。

于 2009-06-21T15:42:39.697 に答える
3

これを行う唯一の方法は、新しい AppDomain を開始して元の AppDomain をアンロードすることだと思います。これは、ASP.NET が常に web.config への変更を処理する方法です。

于 2009-06-21T15:30:24.167 に答える
3

一部のセクションを変更するだけの場合は、ConfigurationManager.Refresh("sectionName") を使用して、ディスクからの再読み取りを強制できます。

static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set(data));

        var configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine(configValue);

        Console.WriteLine("Update the config file ...");
        Console.ReadKey();

        configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine("Before refresh: {0}", configValue);

        ConfigurationManager.RefreshSection("appSettings");

        configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine("After refresh: {0}", configValue);

        Console.ReadKey();
    }

(これをテストするときに、VS ホスティング プロセスを使用している場合は、application.vshost.exe.config ファイルを変更する必要があることに注意してください。)

于 2009-06-21T15:48:27.063 に答える