0

重複
の可能性: Assembly.LoadFrom() でロードされたアセンブリのアンロード

カスタムを使用AppDomainしてアセンブリをロード/アンロードします。しかし、アセンブリがアンロードされると、AppDomain.CurrentDomain.

どうしてですか?これは正常な動作ですか、それとも何か不足していますか?

手がかりをありがとう!

 string assemblyPath = @"C:\MyFile.dll";
 var assemblyName = AssemblyName.GetAssemblyName(assemblyPath);

            var ads = new AppDomainSetup
                          {
                              ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase, 
                              DisallowCodeDownload = true 
                          };

            AppDomain newDomainName = AppDomain.CreateDomain("newDomainName", null, ads);
              try
              {
                  Assembly testLibrary = newDomainName.Load(assemblyName);

                  var c1 = AppDomain.CurrentDomain.GetAssemblies();

                  var c2 = newDomainName.GetAssemblies();
              }
              finally
              {
                  AppDomain.Unload(newDomainName);

                  var c3 = AppDomain.CurrentDomain.GetAssemblies();

                  // The assembly is still visible here!!!
              }
4

2 に答える 2

4

ドキュメントLoad()によると、AppDomainのメソッドを呼び出しています。「現在のアプリケーション ドメインにアセンブリをロードするためだけに使用する必要があります。このメソッドは、静的な Assembly.Load メソッドを呼び出すことができない相互運用性の呼び出し元の便宜のために提供されています。アセンブリを他のアプリケーション ドメインに読み込むには、CreateInstanceAndUnwrap などのメソッドを使用してください。」

Load() つまり、プライマリ AppDomainから呼び出しているため(セカンダリ AppDomain のインスタンスで呼び出しを使用しているにもかかわらず) 、アセンブリをプライマリ AppDomain にロードしています。セカンダリ AppDomain をアンロードします。

上記のドキュメントからの抜粋に示されているように、おそらくAppDomain.CreateInstanceAndUnwrapを使用する必要があります。

于 2012-09-17T13:30:12.330 に答える
2

読み込まれたアセンブリをアプリ ドメインから削除することはできません。

http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

http://msdn.microsoft.com/en-us/library/ms173101(v=vs.80).aspx

アセンブリを含むすべてのアプリケーション ドメインをアンロードせずに、個々のアセンブリをアンロードする方法はありません。アセンブリが範囲外になっても、実際のアセンブリ ファイルは、それを含むすべてのアプリケーション ドメインがアンロードされるまで読み込まれたままになります。

http://blogs.msdn.com/b/suzcook/archive/2003/07/08/unloading-an-assembly.aspx

アセンブリを含むすべてのアプリ ドメインをアンロードせずに、個々のアセンブリをアンロードする方法はありません。

于 2012-09-17T13:25:51.717 に答える