c# problem bei dll import(unmanaged code)

muehlbacher

Grünschnabel
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.:confused:
Danke schon mal für eure Hilfe

Markus

verwende Framework 2.0


C# code
Code:
[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:
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);
 

Neue Beiträge

Zurück