2

遅延バインディングを使用してアクセスされた (つまり、Activator.CreateInstance()メソッドによって作成された) オブジェクトを解放する方法はありますか?

ファイルをある形式から別の形式に変換するアプリケーションがあります。これらの変換を実行するアセンブリは、アプリケーション ディレクトリ内のフォルダーにあります。

アプリケーションの初回起動時に、これらのアセンブリを翻訳フォルダーからエラーなしで削除できます。ただし、アプリケーションを介してドキュメントを処理すると (そして遅延バインディングを使用して翻訳アセンブリの 1 つにバインドすると)、翻訳アセンブリを削除できなくなります。この時点で、ファイルが「別のアプリケーションで使用されている」というエラー メッセージが表示されます。

アプリケーションの使用が終了したら、遅延バインドされたオブジェクトを「解放」する方法はありますか?

4

2 に答える 2

1

アセンブリがアプリケーション ドメインに読み込まれると、アプリ ドメインがシャットダウンするまで残ります。

これを回避するには、アセンブリを独自のアプリケーション ドメインに読み込みます。次に例を示します。

AppDomain app = AppDomain.CreateDomain("PlugInDomain");
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
             "MyNamespace.MyComponent");
MyComponent component = (MyComponent) objectHandle.Unwrap();

// do stuff

// Now kill app domain, assembly can be overwritten after this.
AppDomain.Unload(app);
于 2010-10-13T16:21:57.233 に答える
0

アセンブリが実行中の AppDomain に読み込まれると、それをアンロードすることはできません (Activator.CreateInstance でリフレクションを介して作成しているかどうかに関係なく)。

ここで推奨されるアプローチは、アセンブリを破棄する必要があるときにアンロードできる有効期間を持つセカンダリ AppDomain を実装することです。

例はたくさんありますが、ここにその 1 つを示します: http://www.dotnet247.com/247reference/msgs/28/142174.aspx

セカンダリ AppDomains の有効期間を管理するのは面倒な場合があるため、別の方法として、ASP .NET を使用していて、多くの動的アセンブリを読み込もうとしている場合は、現在の AppDomain が動的に読み込まれたアセンブリで飽和状態になる時期を、AppDomain.CurrentDomain.AssemblyLoadedイベントにバインドすることで確認できます。カウントを維持し、次のような重要な数 (たとえば 500) に達すると、現在の AppDomain をリサイクルするようにホスティング環境に要求します。

HostingEnvironment.InitiateShutdown();
于 2010-10-13T16:17:33.030 に答える