2009-04-07 33 views
3

インポートされたメソッドを使用すると、ASP.NETでDllが読み込まれ、ファイルの使用が終了した後でもファイルがロックされるため、DllImportとASP.NETにいくつかの問題があります。 ASP.NETがファイルのロックを解除するように強制する方法はありますか?DllImportとASP.NET

答えて

2

.NETでプロセスからDLLを強制的に削除する唯一の方法は、DLLがロードされているAppDomainをアンロードすることです。 DllImportコードを実行する別のAppDomainを作成しない限り、これは可能ではありません。

また、私はこのポリシーがマネージドDLLに適用されることを知っています。私はこれがDLLのPINvoke経由でロードされる場合は100%確信していませんが、私はかなり確信しています。

+0

私の場合、ピンボケ付きのdllで動作しませんでした。 dllに依存することがあります。 – Sire

2

新しいAppDomainを作成し、dllをドメインにロードする場合のみ。その後、AppDomainをアンロードすると、dllがアンロードされます。

0

AppDomainのアンロードは唯一の答えではありません。ピンボケを使用してLoadLibraryFreeLibraryを使用してライブラリをアンロードすることもできます。 FreeLibraryを2回呼び出して、ライブラリの依存関係もアンロードされるようにしてください。

私はこれをテストしていませんが、私はこのようなクラスは、より簡単にこれを行うことになるだろうと想像:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern IntPtr LoadLibrary(string libname); 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool FreeLibrary(IntPtr hModule); 

class LibraryHandle 
{ 
    readonly string libName; 
    int refCount = 0; 
    IntPtr handle; 

    public LibraryHandle(string name) 
    { 
     libName = name; 
    } 

    public void Increment() 
    { 
     if (refCount == 0) 
     { 
      handle = LoadLibrary(libName); 
      if (Handle == IntPtr.Zero) 
      { 
       int error = Marshal.GetLastWin32Error(); 
       throw new Exception(string.Format("{0})", error)); 
      } 
     } 
     ++refCount; 
    } 

    public void Decrement() 
    { 
     if (refCount <= 0) 
      return; 

     if (--refCount) 
     { 
      // It might be better in some cases to: 
      // while(FreeLibrary(handle)); 
      FreeLibrary(handle); 
      FreeLibrary(handle); 
     } 
    } 
} 

はちょうどこの例は、あなたがしたいと思うこれは、安全なスレッドされていないことを警告しますASP.NETで保証され、完全なエラーチェックは行われません。

また、ランタイムによって行われたいくつかの前提条件に違反する可能性があるため、ロードしていないライブラリでFreeLibraryを使用することはお勧めできません。

もう1つの方法は、新しいAppDomainの操作を実行し、完了したらアンロードすることです。

関連する問題