expertenaustausch > microsoft.* > microsoft.german.entwickler.dotnet.framework

Gerald Mahlmeister (14.02.2006, 11:16)
Hallo!

Wie kann ich zugreifbaren Speicher in DotNET erstellen? Also ein Pendant zu
malloc in C.

Muß gerade für eine etwas komplexe Plugin Struktur programmieren, dabei ruft
eine unmanaged Application eine .NET Library auf. An einer Stelle wird ein
Zeiger auf allokierten Speicher erwartet. Intern kopiert sich die
Applikation den Inhalt heraus und ruft wohl einen free auf. Doch bei all
meinen Versuchen Speicher aus DotNET heraus zu belegen, kommt eine Heap
Zugriffsverletzung.

Außer Marshal.AllocHGlobal, was wohl was anderes als malloc ist (Verzeihung,
bin nicht mal im Ansatz Cler *g*), habe ich nichts gefunden.
(Ein Versuch über COM Interop und IMalloc ist auch gescheitert)

Weiß jemand Rat?

Gruß
Gerald
Thomas Scheidegger [MVP] (14.02.2006, 11:42)
Hallo Gerald

> ruft eine unmanaged Application eine .NET Library auf


ist IMHO eher eine unübliche Konstellation...

> Wie kann ich zugreifbaren Speicher in DotNET erstellen? Also ein Pendant zu
> malloc in C.


ein 'echtes' Pendant kann es nicht geben,
denn 'malloc' nutzt interne Heaps der C-Runtime.
Speicher, der mit 'malloc' alloziert wurde muss zwingend mit 'free'
freigegeben werden, umgekehrt ebenso ('Gleichgewicht').

Keine Chance mit .NET alleine, gibt nur Leaks/Crashs...

> eine unmanaged Application eine .NET Library auf. An einer Stelle wird ein
> Zeiger auf allokierten Speicher erwartet. Intern kopiert sich die
> Applikation den Inhalt heraus und ruft wohl einen free auf.


spekulieren gilt nicht, du musst schon herausfinden ob es wirklich 'free' ist...

> Doch bei all meinen Versuchen Speicher aus DotNET heraus zu belegen,
> kommt eine Heap Zugriffsverletzung.


Lösungen:
- Du musst in jener 'unmanaged Application' eine C++-Hilfsmethode
zum allozieren via malloc erstellen, welche von der .NET-Lib aufgerufen werden muss
(zB via Callback oder PInvoke)

- Oder du musst jene 'unmanaged Application' umbauen,
damit diese zB Win32: GlobalFree nutzt (anstelle 'free'),
dann passt .NET seitig: Marshal.AllocHGlobal

> bin nicht mal im Ansatz Cler


ist IMHO bei solchen Projekten ein Risiko.
Gerald Mahlmeister (15.02.2006, 15:46)
Hallo Thomas!

> > ruft eine unmanaged Application eine .NET Library auf

> ist IMHO eher eine unübliche Konstellation...

Was will man machen, 15 Jahre alte Applikationen schreibt man nicht einfach
mal neu....

> Pendant zu
> ein 'echtes' Pendant kann es nicht geben,
> denn 'malloc' nutzt interne Heaps der C-Runtime.
> Speicher, der mit 'malloc' alloziert wurde muss zwingend mit 'free'
> freigegeben werden, umgekehrt ebenso ('Gleichgewicht').
> Keine Chance mit .NET alleine, gibt nur Leaks/Crashs...
> wird ein
> spekulieren gilt nicht, du musst schon herausfinden ob es wirklich 'free'
> ist...

Das ist nicht ganz so einfach, hier sind so einige Welten zusammen und
obwohl das alles sehr alt ist, kommt nirgends wirklich C/C++ zum Einsatz
(außer in meiner kleinen Wrapper Dll). Glaube die ganze Wahrheit willst Du
nicht wissen ;)

> Lösungen:
> - Du musst in jener 'unmanaged Application' eine C++-Hilfsmethode
> zum allozieren via malloc erstellen, welche von der .NET-Lib aufgerufen
> werden muss
> (zB via Callback oder PInvoke)

Habe ich jetzt so in etwa gemacht. Den Speichercode komplett in C++ verfasst
und nun geht es. Danke.

Ist aber echt was für Masochisten. Wann nun *, **, ^, ->, :: , . kommt :D.
Darum wollte ich das eigentlich ursprünglich in .NET verfassen.

> > bin nicht mal im Ansatz Cler

> ist IMHO bei solchen Projekten ein Risiko.

Da ist inzwischen so ein Kauderwelsch beteiligt, daß man einfach gar nicht
alles beherrschen kann.

Gruß
Gerald
Ähnliche Themen