Hallo!

Ich möchte eine dll in c# einbinden(driver.dll). Die Spezifikation für den Dll-Zugriff(verwendete Datentypen) habe ich aus einem Header-Files(c++) herausgelesen. Möchte nun mit meiner C# Applikation die dll-Befehle aufrufen können. Meistens funktioniert die Aufrufe problemlos.

Aber es treten auch Exception bzw. Errormeldungen auf:

z.Bsp.:

Error1:
FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error. The address of the error was at 0x79eea33a, on thread 0x484. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack

Error2:ExecutionEngine Exception was thrown

Error3:
Fehler in Anwendung:
Die Anweisung in “0x01217c48” verweist auf Speicher in “0x3f0000b0“ Der Vorgang Written konnte nicht auf dem Speicher durchgeführt werden.


Solche Fehlermeldungen können durch den dll-import von unmanaged code.

Problem:Bei welchen Imports liegen ich mit meine Deklarationen falsch.


Ich habe leider keine Ahnung wo sich das Problem versteckt.
Danke schon mal für eure Hilfe

Markus

verwende Framework 2.0


C# code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[StructLayout (LayoutKind.Sequential, Pack=1)]
        public struct _cfg
        {
            public Int16 version;
            [MarshalAs(UnmanagedType.ByValArray ,SizeConst=14)]
            public char[] serial;
           
            public _channel Channel0;
            public _channel Channel1;
            public _channel Channel2;
            public _channel Channel3;
            public _channel Channel4;
            public _channel Channel5;
            public _channel Channel6;
            public _channel Channel7;
        }
 
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct _channel
        {
            public float highpass;
            public float lowpass;
            public float sensitivity;
            public float samplerate;
            public char polarity;
        }
 
        [StructLayout (LayoutKind.Sequential,Pack=1)]
        unsafe public struct Buffer // structure used to handle buffers
        {
            public short* pBuffer;
            public UInt32 size;      // Buffersize in bytes: max. 1024 bytes
public UInt32 validPoints; // number of data points returned from driver 
            //data point size is 2 bytes
        }
 
      
         [DllImport("driver.dll")]
         static extern IntPtr GT_OpenDevice([MarshalAs(UnmanagedType.LPStr)] string lpPort);
        
     [DllImport("driver.dll")]
       static extern bool GT_GetData(IntPtr hDevice, ref Buffer buffer, out System.Threading.NativeOverlapped lpovl);
 
         [DllImport("driver.dll")]
   private static extern bool GT_GetConfig(IntPtr hdevice, IntPtr p_cfg);
 
 
public bool GetConfig(IntPtr hdevice, out _cfg ConfigMobilLab)
        {
            bool ret;
            ret = false;
            IntPtr p_cfg1 = Marshal.AllocHGlobal(4);
            ret = GT_GetConfig(hdevice, p_cfg1);
            ConfigMobilLab = (_cfg)Marshal.PtrToStructure(p_cfg1, typeof(_cfg));
            Marshal.FreeHGlobal(p_cfg1);
            return ret;
        }

c++ Header File
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
typedef struct // structure used to handle buffers
{
    SHORT   *pBuffer;    // Pointer to buffer
    UINT    size;        // Buffersize in bytes: max. 1024 bytes
    UINT    validPoints; // number of data points returned from driver 
}_BUFFER_ST;             // (data point size is 2 bytes)
 
typedef struct
{
    float highpass;
    float lowpass;
    float sensitivity;
    float samplerate;
    char polarity;
}__channel;
 
typedef struct
{
    __int16 version;
    char serial[14];
    __channel channels[8];
}__cfg;
 
GMOBILABPLUS_API HANDLE __stdcall GT_OpenDevice(LPSTR lpPort);
 
GMOBILABPLUS_API BOOL __stdcall GT_GetData(HANDLE hDevice,_BUFFER_ST *buffer,LPOVERLAPPED lpOvl);
 
GMOBILABPLUS_API BOOL __stdcall GT_GetConfig(HANDLE hdevice, __cfg * cfg);