Laden...

DllImport: Struktur mit char* richtig in C# umsetzen

Erstellt von claine vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.346 Views
C
claine Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
DllImport: Struktur mit char* richtig in C# umsetzen

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?

4.931 Beiträge seit 2008
vor 13 Jahren

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").

C
claine Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

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?

S
469 Beiträge seit 2007
vor 13 Jahren

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

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

S
8.746 Beiträge seit 2005
vor 13 Jahren

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);