Laden...

LoadLibrary und FreeLibrary System.NullReferenceExveption

Erstellt von Pako vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.488 Views
P
Pako Themenstarter:in
78 Beiträge seit 2006
vor 18 Jahren
LoadLibrary und FreeLibrary System.NullReferenceExveption

Hallo,

ich importiere mir eine DLL zur Laufzeit mittels pinvoke.
Danach gebe ich die DLL wieder frei mit FreeLibrary.

Wenn ich nun LoadLibrary erneut aufrufe (selbe DLL) wird die DLL neu geladen (IntPtr h = LoadLibrary(xxx.dll) hat den gleichen Wert). Wenn die DLL nicht identisch ist (selber DLL Name andere Version) dann gibt es Fehler.
Wenn ich den Speicher des IntPtr nach FreeLibrary lösche dann läd er die DLL überhaupt nichtmehr.

Ich vermute es wird beim allersten Import der DLL Speicher allokiert. Bei Jedem weiteren Import einer DLL gleichen Namens lädt er die DLL in den selben Speicher. Hat die DLL eine andere Größe fliegt er auf die Schnauze.

Der Fehler Tritt beim Aufruf der Exportierten DLL Funktion auf.

System.NullReferenceExveption
Object reference not set to an instance of an object.

in .Net 2.0 lautet der Fehler
System.AccessViolationException
Attemped to read or write protected memory. This is often an indication that other memory is corrupt.

Grüße
Patrick

S
8.746 Beiträge seit 2005
vor 18 Jahren

Load/FreeLibrary kann sowieso nicht von managed Code aus genutzt werden. Du bekommst zwar noch einen Pointer auf die Libary, aber die Funktionszeiger sind nicht benutzbar.

Einziger Ausweg ist unmanaged C++ oder ein böser Assembler-Hack der es allerdings erfordert eine Wrapper-Lib zu schreiben, in der jede zu nutzende Funktion noch einmal auftaucht. Um einen wie auch immer gearteten Wrapper kommst du nicht drumrum.

Unter .NET ist die Einbindung von unmanaged DLLs daher immer statisch (aus Sicht der .NET-Applikation, intern wird dynamische Bindung benutzt). Stichwort DllImport.

P
Pako Themenstarter:in
78 Beiträge seit 2006
vor 18 Jahren

ok vielen dank, ich dachte es wäre einfacher da das loadlibrary so einfach funktionierte bis auf genannte einschränkungen.

Hast du dazu irgendeinen link? Bin c# neuling.

Grüße

S
8.746 Beiträge seit 2005
vor 18 Jahren

Einfach in der Hilfe "dllimport" eingeben. Dann "about dllimport". Schon hast du ein Beispiel.