2

C#でアンインストールユーティリティを作成しています。ユーティリティは、Regasmを介して登録されたファイルの登録を解除してから、それらのファイルを削除します。

Assembly asm = Assembly.LoadFrom("c:\\Test.dll")
int count = files.Length;
RegistrationServices regAsm = new RegistrationServices();
if (regAsm.UnregisterAssembly(asm))
MessageBox.Show("Unregistered Successfully");

上記のコードは正常に動作しますが、Test.dllを削除しようとすると、エラーが表示され、削除できません。Assembly.LoadFrom( "c:\ Test.dll")がこのファイルへの参照を保存していて、それを失っていないことを私は理解しています。この問題を解決する方法はありますか?

よろしくお願いします

4

2 に答える 2

3

タイプを別のアプリドメインにロードする必要があります。通常、これは MarshalByRefObject から派生した型を別のドメインにロードし、インスタンスを元のドメインにマーシャリングし、プロキシ経由でメソッドを実行することによって行われます。難しく聞こえるので、例を次に示します。

public class Helper : MarshalByRefObject // must inherit MBRO, so it can be "remoted"
{
    public void RegisterAssembly()
    {
      // load your assembly here and do what you need to do
      var asm = Assembly.LoadFrom("c:\\test.dll", null);
      // do whatever...
    }
}

static class Program
{
    static void Main()
    {
      // setup and create a new appdomain with shadowcopying
      AppDomainSetup setup = new AppDomainSetup();
      setup.ShadowCopyFiles = "true";
      var domain = AppDomain.CreateDomain("loader", null, setup);

      // instantiate a helper object derived from MarshalByRefObject in other domain
      var handle = domain.CreateInstanceFrom(Assembly.GetExecutingAssembly().Location, typeof (Helper).FullName);

      // unwrap it - this creates a proxy to Helper instance in another domain
      var h = (Helper)handle.Unwrap();
      // and run your method
      h.RegisterAssembly();
      AppDomain.Unload(domain); // strictly speaking, this is not required, but...
      ...
    }
}
于 2012-09-17T12:44:31.713 に答える
1

ロードされているアセンブリをアンロードすることはできません。シャドウ コピー、または別のドメインへのアセンブリの読み込みが役立ちます。

于 2012-09-17T11:47:19.587 に答える