6

AppDomain と Activator の違いを理解するために質問したいのですが、appdomain.CreateInstance 経由で dll をロードしました。しかし、インスタンスを作成する方法が増えたことに気付きました。したがって、いつ、どこでこの方法を選択するのでしょうか? 例1:

    // Use the file name to load the assembly into the current
    // application domain.
    Assembly a = Assembly.Load("example");
    // Get the type to use.
    Type myType = a.GetType("Example");
    // Get the method to call.
    MethodInfo myMethod = myType.GetMethod("MethodA");
    // Create an instance.
    object obj = Activator.CreateInstance(myType);
    // Execute the method.
    myMethod.Invoke(obj, null);

例 2:

public WsdlClassParser CreateWsdlClassParser()
{
    this.CreateAppDomain(null);

    string AssemblyPath = Assembly.GetExecutingAssembly().Location; 
    WsdlClassParser parser = null;
    try
    {                
        parser = (WsdlClassParser) this.LocalAppDomain.CreateInstanceFrom(AssemblyPath,
                                          typeof(Westwind.WebServices.WsdlClassParser).FullName).Unwrap() ;                
    }
    catch (Exception ex)
    {
        this.ErrorMessage = ex.Message;
    }                        
    return parser;
}

例3:

private static void InstantiateMyTypeSucceed(AppDomain domain)
{
    try
    {
        string asmname = Assembly.GetCallingAssembly().FullName;
        domain.CreateInstance(asmname, "MyType");
    }
    catch (Exception e)
    {
        Console.WriteLine();
        Console.WriteLine(e.Message);
    }
}

なぜもっと多くのメソッドが必要なのか、または違いは何なのか説明できますか?

4

2 に答える 2

4

sscli2.0 ソース コードから、 AppDomainクラスの "CreateInstance" メソッド呼び出しは常に呼び出しをActivatorに委譲しているように見えます。

(ほぼ静的な) Activatorクラスの唯一の目的は、さまざまなクラスのインスタンスを「作成」することですが、AppDomainはまったく異なる (そしておそらくより野心的な) 目的で導入されます。

  1. アプリケーション分離の軽量ユニット。
  2. AppDomains をアンロードできるため、メモリ消費を最適化します。
  3. ...

zmbq が指摘したように、1 番目と 3 番目の例は簡単です。2 番目の例は、著者が AppDomain を使用して古いプロキシをアンロードする方法を示したこの投稿からのものだと思います。

于 2012-03-13T13:14:54.367 に答える
2

1つ目はExample、アセンブリ'example'から型のインスタンスを作成し、それを呼び出しますMethodA

MyType3つ目は、別のインスタンスを作成しますAppDomain

2つ目についてはわかりませんがthis、何であるかはわかりませんが、現在のアプリドメインにクラスが作成されているようです。つまり、1つ目と似ています。

于 2012-03-13T09:11:26.053 に答える