Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
LoadLibrary und FreeLibrary System.NullReferenceExveption
Pako
myCSharp.de - Member



Dabei seit:
Beiträge: 78

Themenstarter:

LoadLibrary und FreeLibrary System.NullReferenceExveption

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Pako
myCSharp.de - Member



Dabei seit:
Beiträge: 78

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Einfach in der Hilfe "dllimport" eingeben. Dann "about dllimport". Schon hast du ein Beispiel.
private Nachricht | Beiträge des Benutzers