Hi,
Ich hab ne C-Dll auf die ich mit C# zugreifen muss.
Dabei will ich Daten auslesen die in C in der Struktur
typedef struct
{
long Unit ;
long Status ;
long InterfaceNumber ;
long UnitAddress ;
long Value ;
long Count ;
long SerialNumber ;
char* Description ;
} Block ;
gespeichert werden.
Auslesen tu ich das mit der Dll-Funktion
ReadDetails (long Number, Block* Snapshot) ;
Klappt soweit einwandfrei.
In C# hab ich das ganze dann so umgesetzt
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class Block
{
public System.UInt32 Unit;
public System.Int32 Status;
public System.UInt32 InterfaceNumber;
public System.UInt32 UnitAddress;
public System.UInt32 Value;
public System.UInt32 Count;
public int SerialNumber;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] Description;
}
und rufe sie dann so auf
[DllImport("unithandle.dll", EntryPoint = "_ReadDetails@8")]
static extern System.Int32 ReadDetails(System.Int32 Number, [In] Block block);
Alles funktioniert, bis auf die Description. Also den Char*.
Kann mir jemand sagen wie man so einen Pointer richtig übergibt?
Du kannst auch mal folgendes Tool benutzen: PInvoke Interop Assistant http://clrinterop.codeplex.com/releases/view/14120
Ich meine, statt "char[]" einfach "string" benutzen (bin mir aber nicht sicher, evtl. auch StringBuilder).
P.S. Und du solltest einheitlich "Int32" (bzw. "int") benutzen (d.h. dich für eines von beiden entscheiden - außerdem benutzt du auch noch "UInt32" statt "Int32").
Also mit string geht's nicht.
Hab auch schon ein bisschen rumprobiert.
Das Programm hilft mir auch nicht viel weiter.
Kann mir jemand sagen wie ich nen äquivalent zu nem char* in die Struktur baue?
Ich hatte ein ähnliches Problem mal mit nem unsigned char*.
Ist nicht genau das gleiche Szenario, aber vielleicht hilft dir das weiter (bzw. das was unten in der Lösung in dem MarshalAs steht):
[gelöst] C++Dll Import: Funktion mit char* Parameter: nicht Interop-Kompatibel
Ich kenn mich mit der Materie sonst allerdings auch nicht aus, hab das damals auch nur so im Internet nach tagelanger Suche und einigen Fehlversuchen ergoogelt und übernommen...
gruß
sth_Weird
Linux is for free...if your time is worth nothing
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht
++++++++++++++++++++~+
Offensichtlich soll hier Out-Marshalling verwendet werden, versuche mal:
[DllImport("unithandle.dll", EntryPoint = "_ReadDetails@8")]
static extern System.Int32 ReadDetails(System.Int32 Number, [In, Out] Block block);