C# und native code

27/05/2009 - 08:49 von Andreas Otto | Report spam
Hallo,

Ich habe ein Problem mit der Anbindung an eine C Bibliothek

Ein Beispiel:

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public struct MyS
{
public int myNum;
public string myName;
public double myVal;
}

Die obige struct wird in C erzeugt und zurückgegeben und als IntPtr
abgespeichert.

Spàter werden in C# die werte gesetzt und an die C Bibliothek zur
Weiterverarbeitung übergeben

Beispiel

void SetPointer(int num, string name, double val)
{
System.Console.WriteLine("SetPointer");
MyS local = (MyS) Marshal.PtrToStructure(data, typeof(MyS));
local.myNum = num;
local.myName = name;
local.myVal = val;
Marshal.StructureToPtr(local, data, true);
}

das ist alles kein Problem und der String "myName" kommt auch richtig
an ...

Nun das Problem ...
In der Bibliothek wird die struct auch wieder freigegeben ...
bei dem freigeben des String mit "free" knallt es ...
Grund ... C# meint wohl der String gehört mir und nicht der Bibliothek

Frage: wie transportiere Ich einen String mittels der struct MyS in
die Bibliothek wenn der String dann mit "free" freigegeben werden soll



mfg

Andreas Otto
 

Lesen sie die antworten

#1 Kerem Gümrükcü
27/05/2009 - 09:15 | Warnen spam
Hallo Andreas,

arbeite mit einem IntPtr, also mit rohen Zeigern,
die Du dann auch in dem gleichen Prozess/Thread
freigeben kannst. Arbeite dabei mit Speicherfunktionen
wie Marshal.AllocHGlobal (ist intern LocalAlloc(...)) und
gib diese dann mit LocalFree in dem C Program frei. Ich
weiss aber nicht auf anhieb, wie die CLR darauf reagieren
wird, bin mir aber sicher, das es kein Problem sein dürfte.

Aber das ist erst mal Nebensache, denn viel wichtiger ist
wie die Original C Struktur aussieht, da es sein kann, das
deine Struktur völlig falsch nach .NET übersetzt ist. Zeige
mal diese bitte im Original,..

Genrell ist es aber keine gute Idee, etwas in C# zu erzeugen
und das dann in einer unmanaged lib freizugeben,-(

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

"Andreas Otto" schrieb im Newsbeitrag
news:gvinpr$vis$02$

Hallo,

Ich habe ein Problem mit der Anbindung an eine C Bibliothek

Ein Beispiel:

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public struct MyS
{
public int myNum;
public string myName;
public double myVal;
}

Die obige struct wird in C erzeugt und zurückgegeben und als IntPtr
abgespeichert.

Spàter werden in C# die werte gesetzt und an die C Bibliothek zur
Weiterverarbeitung übergeben

Beispiel

void SetPointer(int num, string name, double val)
{
System.Console.WriteLine("SetPointer");
MyS local = (MyS) Marshal.PtrToStructure(data, typeof(MyS));
local.myNum = num;
local.myName = name;
local.myVal = val;
Marshal.StructureToPtr(local, data, true);
}

das ist alles kein Problem und der String "myName" kommt auch richtig
an ...

Nun das Problem ...
In der Bibliothek wird die struct auch wieder freigegeben ...
bei dem freigeben des String mit "free" knallt es ...
Grund ... C# meint wohl der String gehört mir und nicht der Bibliothek

Frage: wie transportiere Ich einen String mittels der struct MyS in
die Bibliothek wenn der String dann mit "free" freigegeben werden soll



mfg

Andreas Otto



Ähnliche fragen