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.
Danke schon mal für eure Hilfe
Markus
verwende Framework 2.0
C# code
c++ Header File
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:
[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);