2009-04-07 5 views
3

Ich habe einige Probleme mit DllImport und ASP.NET, denn wenn ich eine importierte Methode ASP.NET lädt die DLL und sperrt die Datei auch nach der Verwendung von es. Gibt es eine Möglichkeit, ASP.NET zu zwingen, die Sperre für die Datei freizugeben?DllImport und ASP.NET

Antwort

2

Die einzige Möglichkeit, eine DLL aus dem Prozess in .NET zu erzwingen, ist das Entladen der AppDomain, in der die Dll geladen wird. Sofern Sie keine separate Anwendungsdomäne erstellen, in der der DllImport-Code ausgeführt wird, ist dies nicht möglich.

Auch ich weiß, dass diese Richtlinie für verwaltete DLLs gilt. Ich bin mir nicht 100% sicher, ob dies für DLLs gilt, die über PINvoke geladen werden, aber ich bin ziemlich sicher.

+0

Für mich funktionierte es nicht mit pinvoke hinzugefügt dlls. Könnte von der DLL abhängen. – Sire

2

Nur wenn Sie eine neue AppDomain erstellen und die DLL in die Domäne laden. Danach können Sie die AppDomain entladen und die DLL wird entladen.

0

Das Entladen der AppDomain ist nicht die einzige Antwort. Sie können auch LoadLibrary und FreeLibrary über pinvoke verwenden, um die Bibliothek zu entladen. Stellen Sie sicher, dass Sie zweimal FreeLibrary aufrufen, um sicherzustellen, dass alle Abhängigkeiten Ihrer Bibliothek ebenfalls gelöscht werden.

ich nicht getestet haben, aber ich glaube, eine Klasse wie dies würde dies machen zu tun einfacher:

[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); 
     } 
    } 
} 

nur gewarnt werden, dass dieses Beispiel nicht sicher Thread wird, was Sie wollen werden Garantie in ASP.NET und führt keine Fehlerprüfung durch.

Da dies möglicherweise gegen einige Annahmen der Laufzeit verstößt, ist die Verwendung von FreeLibrary für eine Bibliothek, die Sie nicht geladen haben, möglicherweise keine gute Idee.

Eine andere Alternative wäre, die Operation in einem neuen AppDomain durchzuführen und sie dann zu entladen, wenn Sie fertig sind.