2

AppDomainとそのAssemblyResolveイベントをクラス内にラップして、アセンブリ解決プロセスをカスタマイズしようとしています。私の簡略化されたバージョンClassLoaderは以下のとおりです。私が抱えている問題は、イベントが発生したときに、以前に作成したものではなく、AssemblyResolveの新しいインスタンスを取得したように見えることです。ClassLoader

[Serializable]
public class ClassLoader // : IDisposable
{
    public AppDomain Domain { get; private set; }
    public string FooProperty { get; set; }

    public ClassLoader(string domain) {
        Domain = AppDomain.CreateDomain(domain);
        Domain.AssemblyResolve += Domain_AssemblyResolve;
    }

    private Assembly Domain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        Console.WriteLine(
            "ClassLoader HashCode: {0} FooProperty: {1}\n\n", 
            GetHashCode(), 
            FooProperty);
        // ...
        return null;
    }
    // ...
}

このコードを実行すると、Domain_AssemblyResolve イベント ハンドラーで FooProperty が初期化されず、ClassLoader インスタンスのハッシュ コードが "c" とは異なります。

 var c = new ClassLoader("demo");
 c.FooProperty = "Foo";
 Console.WriteLine(
     "c Hash Code: {0} FooProperty: {1}", 
     c.GetHashCode(), 
     c.FooProperty);
 c.Domain.CreateInstanceAndUnwrap("Not important", "Not important");

何が起こっているのですか?またはいくつかの回避策?

ありがとう!

4

2 に答える 2

2

ClassLoaderインスタンスcはアプリケーション ドメインで作成され、インスタンスAから継承されないためMarshalByRefObject、イベント ハンドラを に追加した時点で作成中のアプリケーション ドメインにシリアル化されますAssemblyResolve。これは、メソッドがインスタンス メソッドであり、デリゲートがメソッドが呼び出されるターゲット オブジェクトへの参照を必要とするために発生します。

イベント ハンドラーがトリガーされたときに特定の値が必要FooPropertyな場合は、プロパティを初期化した後にのみイベント ハンドラーを追加して、値をシリアル化し、新しく作成されたアプリケーション ドメインで使用できるようにします。

public string FooProperty { get; private set; }

public ClassLoader(string domain, string fooProperty)
{
    FooProperty = fooProperty; // Set it before adding event handler
    Domain = AppDomain.CreateDomain(domain);
    Domain.AssemblyResolve += Domain_AssemblyResolve;
}

cインスタンスが両方のアプリケーション ドメインで使用可能であるという要件がある場合は、以下を確認する必要があります。

オブジェクトをリモート可能にする

.NET Framework Remoting を使用したイベントとデリゲート

于 2010-06-30T10:55:44.497 に答える
0

良い、

このコードを実行すると、Domain_AssemblyResolve イベントで FooProperty が初期化されません。

Fooハンドラー内で初期化するコードはないようです。

ClassLoader インスタンスのハッシュ コードは「c」とは異なります。

あなたの場合のように、 Object から継承し ( などClassLoader)、 reimplement しないクラスのインスタンスGetHashCode()はすべて、(オブジェクトのアドレスに基づいて) 異なるハッシュ コードを持ちます。GetHashCode()内部状態に基づいて一貫したコードが必要な場合はオーバーライドします。

于 2010-06-30T10:35:54.067 に答える