問題を明確に説明するために、まず例を見てみましょう。この例では、WinForm に ボタン があり、ユーザーがこのボタンをクリックすると、既存のアセンブリがロードされ、アセンブリの FullName がインターフェイスのラベルコントロールに表示されます。 Reflection に少し詳しい人は、これが非常に簡単であることを知っています。次のように、Assembly.LoadFile メソッドを使用してアセンブリを取得し、次に FullName 属性 を使用してそれを表示するだけです。コード:
private void button1_Click(object sender, EventArgs e) { Assembly assembly = Assembly.LoadFile(@"C:\testlib.dll"); label1.Text = assembly.FullName; }
もちろん、プログラムは正常に実行され、コンパイル時エラーや実行時エラーは見つかりません。ただし、このプログラムを終了せずに呼び出された testlib.dll をコンパイルすると、Visual Studio はコンパイルを完了できず、ファイルが他の プロセスによって使用されていることを示すメッセージが表示されます。 実際、私たちのプログラムはこの testlib.dll とは密接な関係はありません。testlib.dll の基本情報を表示するだけです。 testlib.dll が共有ライブラリである場合、リソースの排他問題が他のプログラムの通常の動作に影響を与えます。 アセンブリにはアンロード機能がありませんが、Ap
pDomainを使用してこの問題を解決できます。基本的な考え方は、新しい AppDomain を作成し、この新しい AppDomain にアセンブリを読み込み、その中のメソッドを呼び出して、取得した結果を返すというものです。すべての操作が完了したら、AppDomain.Unload メソッドを呼び出して、新しく作成した AppDomain をアンインストールします。これにより、アセンブリもアンインストールされます。注: ロードされたアセンブリを現在のアプリケーション ドメイン (AppDomain) に直接返すことはできません。 まず、RemoteLoader を作成します。この RemoteLoader は、新しく作成した AppDomain にアセンブリをロードし、外部の世界にアセンブリの FullName を取得できるように属性を公開するために使用されます。 RemoteLoader は MarshalByRefObject から継承する必要があります。コードは次のとおりです:
public class RemoteLoader : MarshalByRefObject { private Assembly assembly; public void LoadAssembly(string fullName) { assembly = Assembly.LoadFrom(fullName); } public string FullName { get { return assembly.FullName; } } }
次に、Loc
public class LocalLoader { private AppDomain appDomain; private RemoteLoader remoteLoader; public LocalLoader() { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationName = "Test"; setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private"); setup.CachePath = setup.ApplicationBase; setup.ShadowCopyFiles = "true"; setup.ShadowCopyDirectories = setup.ApplicationBase; appDomain = AppDomain.CreateDomain("TestDomain", null, setup); string name = Assembly.GetExecutingAssembly().GetName().FullName; remoteLoader = (RemoteLoader)appDomain.CreateInstanceAndUnwrap( name, typeof(RemoteLoader).FullName); } public void LoadAssembly(string fullName) { remoteLoader.LoadAssembly(fullName); } public void Unload() { AppDomain.Unload(appDomain); appDomain = null; } public string FullName { get { return remoteLoader.FullName; } } }
最後に、WinForm の Button Click
以上がAppDomainとAssemblyの動的ロードおよびアンロードコードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。