web-dev-qa-db-ja.com

アプリケーションドメインを作成してその中でアプリケーションを実行するにはどうすればよいですか?

.NETランタイムの デフォルトの動作 のバグを回避するために、カスタムアプリケーションドメインを作成する必要があります。オンラインで見たサンプルコードは、どこに配置するか、またはMain()メソッド内で何を置き換える必要があるかがわからないため、役に立ちません。

定数文字列で修正できるものを回避するためだけに AppDomains を作成することは、おそらく間違った方法であることに注意してください。あなたが指摘したリンクと同じことをしようとしているなら、あなたはただこれをすることができます:

var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
    throw new Exception("do your worst!");

再帰エントリポイント:o)

static void Main(string[] args)
{
    if (AppDomain.CurrentDomain.IsDefaultAppDomain())
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);

        var currentAssembly = Assembly.GetExecutingAssembly();
        var otherDomain = AppDomain.CreateDomain("other domain");
        var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args);

        Environment.ExitCode = ret;
        return;
    }

    Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
    Console.WriteLine("Hello");
}

非静的セカンダリエントリポイントとMarshalByRefObjectを使用したクイックサンプル...

class Program
{
    static AppDomain otherDomain;

    static void Main(string[] args)
    {
        otherDomain = AppDomain.CreateDomain("other domain");

        var otherType = typeof(OtherProgram);
        var obj = otherDomain.CreateInstanceAndUnwrap(
                                 otherType.Assembly.FullName,
                                 otherType.FullName) as OtherProgram;

        args = new[] { "hello", "world" };
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        obj.Main(args);
    }
}

public class OtherProgram : MarshalByRefObject
{
    public void Main(string[] args)
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        foreach (var item in args)
            Console.WriteLine(item);
    }
}
40
Matthew Whited

必要がある:

1)AppDomainSetupオブジェクトのインスタンスを作成し、ドメインに必要なセットアップ情報を入力します

2)AppDomain.CreateDomanメソッドを使用して新しいドメインを作成します。構成パラメーターを持つAppDomainSetupインスタンスがCreateDomainメソッドに渡されます。

3)ドメインオブジェクトでCreateInstanceAndUnwrapメソッドを使用して、新しいドメインにオブジェクトのインスタンスを作成します。このメソッドは、作成するオブジェクトのtypenameを受け取り、新しいドメインで作成されたオブジェクトと通信するためにyuorメインドメインで使用できるリモートプロキシを返します。

これらの3つの手順を完了すると、プロキシを介して他のドメインのメソッドを呼び出すことができます。完了後にドメインをアンロードして、再度リロードすることもできます。

この topic のMSDNヘルプには、必要なもののかなり詳細な例があります

6
mfeingold