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
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.
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.
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.
- 1. Asp.Net C# DllImport Problem
- 2. DllImport und char *
- 3. __declspec (dllimport/dllexport) und Vererbung
- 4. DllImport - PreserverSig und SetLastError Attribute
- 5. Set DllImport Attribut dynamisch
- 6. C# DllImport Probleme
- 7. Mit Dllimport Verfahren
- 8. VSIX dlls mit DllImport
- 9. Wie DllImport char *
- 10. Vista DLLImport Problem C#
- 11. Nicht blockierende Messagebox & DllImport Nachteile
- 12. Makro für dllexport/dllimport switch
- 13. Wie DLLImport DLL-Name festlegen?
- 14. IIS 7.5 Fehler bei einem DLLImport-Aufruf
- 15. Was ist der Unterschied zwischen dllexport und dllimport?
- 16. Unity DllImport schlägt mit .so Bibliotheken fehl
- 17. Versuchen nicht fangen Ausnahme in DllImport Funktion
- 18. Wo sucht DLLImport nach nicht verwalteten DLLs?
- 19. anderer charset für mehrere params mit dllimport
- 20. Wie benutzt man [DllImport ("")] in C#?
- 21. dllimport kann die DLL nicht laden
- 22. Anruf C++ DLL in .net C# DllImport
- 23. C# DllImport: AccessViolationException beim Aufruf eines vkCreateInstance
- 24. C++ Definition von Dllimport statischem Datenelement
- 25. Geben Sie den Suchpfad für DllImport in .NET an
- 26. COM Interop, DllImport gegen das Hinzufügen eines Verweises
- 27. Dllimport konnte DLL nicht finden, obwohl es in der PATH
- 28. Warum gibt meine dllimport-Funktion immer true zurück?
- 29. Nicht möglich, C++ DLL in C# -Projekt mit DllImport
- 30. DllImport, wie überprüft man, ob die DLL geladen ist?
Für mich funktionierte es nicht mit pinvoke hinzugefügt dlls. Könnte von der DLL abhängen. – Sire