3

プラグインシステムでは、オブジェクトをインスタンス化し、識別子(単に文字列)を持ついくつかの着信要求に基づいてそれらのオブジェクトのメソッドを呼び出します。構成の助けを借りて、この識別子は、ロードするアセンブリ、インスタンス化するこのアセンブリのクラス、および呼び出すメソッドを決定します。アセンブリは別のAppDomainにロードされます。これは、次のように作成されたプロキシクラスで発生します。

secondDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase,
    typeof(SecondDomainProxy).FullName) as SecondDamainProxy;

SecondDomainProxyクラスで、identifier上記に関連するアセンブリをロードします。

string assemblyFileName = GetAssemblyFileNameFromConfig(identifier);
Assembly assembly = Assembly.LoadFrom(assemblyFileName);
// Instantiate and run something in assembly

質問:アセンブリがロードされたら、このAssemblyオブジェクトへの参照を保持することは意味がありますか?たとえば、辞書を使って...

Dictionary<string, Assembly> _assemblyDict;

...そして上記のコードを次のように変更します:

Assembly assembly;
if (!_assemblyDict.TryGetValue(identifier, out assembly))
{
    string assemblyFileName = GetAssemblyFileNameFromConfig(identifier);
    assembly = Assembly.LoadFrom(assemblyFileName);
    _assemblyDict[identifier] = assembly;
}
// Instantiate and run something in assembly

Assembly.LoadFromを最初に呼び出した後、AppDomainがアンロードされるまで、アセンブリがロードされることを認識しています。(私の場合、2番目のAppDomainはメインアプリケーションと同じくらい存続します。)つまり、Assembly.LoadFromへの2回目の呼び出しは、辞書検索と同じくらい安い、安い、またはほぼ同じくらい安いということですか?または、assembly.LoadFromを呼び出さず、代わりに保存された参照を使用するという欠点がありますか?

(私が持っていない高いパフォーマンス要件がない限り、それは実際には問題ではないと感じています(およそ15秒ごとに1つの要求)。しかし、私は間違っている可能性があります。)

事前にフィードバックをありがとうございます!

編集:

Assembly「通常の」.NETクラスです。このクラスのインスタンスへの参照がない場合は、ガベージコレクションが行われると思います。ただし、アセンブリ自体はロードされたままです。したがってAssembly.LoadFrom、少なくともAssemblyクラスの新しいインスタンスを作成する必要がありますが、2回目は、このインスタンスの作成は、すでにロードされているアセンブリに基づいている可能性があります。

質問を追加したいと思います。特定のアセンブリのアセンブリオブジェクトを作成するには、かなりの反射が必要であるため、アセンブリがロードされているかどうかに関係なく、常にコストがかかりますか?

4

1 に答える 1

1

いいえ、必要ありません。

AppDomainに読み込まれると、読み込まれた/使用可能なアセンブリを返す基になるAppDomainオブジェクトのGetAssemblies()メソッドを使用して、アセンブリにアクセスできます。http://msdn.microsoft.com/en-US/library/system 。 appdomain.getassemblies.aspx

1つ以上のアセンブリをアンロードする唯一の方法は、同じクラスの静的Unload()メソッドを使用してAppDomainをアンロードすることです。

于 2010-12-25T06:13:27.637 に答える