Hallo C#-Gemeinde !
Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array an eine
API-Funktion zu übergeben. Beim Erstellen des Projektes geht noch alles
gut, allerdings schlägt der Aufruf der Funktion beim Debuggen mit
folgender Meldung fehl :
//
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException'
ist in WindowsApplication1.exe aufgetreten.
Zusätzliche Informationen:
Es kann keine sinnvolle Offsetgröße berechnet werden, da der Typ System.Byte[] nicht als nicht verwaltete Struktur gemarshallt werden kann.
//
Genau dieser Typ System.Byte[]
wird aber in einem Bespielprogramm zu Visual C# verwendet.
Die Compileroption /unsafe ist übrigens aktiviert.
Hier die Deklaration und der Aufruf :
public struct TVendorRequestIn
{
public byte Request;
public ushort Value;
public ushort Index;
public ushort Length;
public byte Direction;
public byte Data;
}
[DllImport("kernel32.dll", EntryPoint = "DeviceIoControl")]
unsafe internal static extern bool IoControlRdRam (uint Handle,
uint IoControlCode,
void* VendorRequestIn,
int InBufferSize,
void* BArray,
int OutBufferSize,
uint* ByteReturn,
uint lpOverLapped);
public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, ushort Addr, ref byte RetByte)
{
TVendorRequestIn VendorRequestIn;
bool RetValue; uint nBytes = 0;
// Initialisierung
VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;
VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;
fixed ( byte* PtrBuffer = &Buffer[5] )
{
// Aufruf
RetValue = IoControlRdRam(Handle, IOCTL_Ezusb_VENDOR_REQUEST,
&VendorRequestIn, 10,
PtrBuffer, Marshal.SizeOf(Buffer),
&nBytes, 0);
}
RetByte = Buffer[0];
return RetValue;
}
Auch das genaue nachvollziehen des Beispieles mit
"fixed ( byte* PtrBuffer = Buffer )" {...}
bringt keinen Erfolg !
Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !
Grüsse Karsten!
Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array an eine
API-Funktion zu übergeben. Beim Erstellen des Projektes geht noch alles
gut, allerdings schlägt der Aufruf der Funktion beim Debuggen mit
folgender Meldung fehl :
//
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException'
ist in WindowsApplication1.exe aufgetreten.
Zusätzliche Informationen:
Es kann keine sinnvolle Offsetgröße berechnet werden, da der Typ System.Byte[] nicht als nicht verwaltete Struktur gemarshallt werden kann.
//
Genau dieser Typ System.Byte[]
wird aber in einem Bespielprogramm zu Visual C# verwendet.
Die Compileroption /unsafe ist übrigens aktiviert.
Hier die Deklaration und der Aufruf :
public struct TVendorRequestIn
{
public byte Request;
public ushort Value;
public ushort Index;
public ushort Length;
public byte Direction;
public byte Data;
}
[DllImport("kernel32.dll", EntryPoint = "DeviceIoControl")]
unsafe internal static extern bool IoControlRdRam (uint Handle,
uint IoControlCode,
void* VendorRequestIn,
int InBufferSize,
void* BArray,
int OutBufferSize,
uint* ByteReturn,
uint lpOverLapped);
public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, ushort Addr, ref byte RetByte)
{
TVendorRequestIn VendorRequestIn;
bool RetValue; uint nBytes = 0;
// Initialisierung
VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;
VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;
fixed ( byte* PtrBuffer = &Buffer[5] )
{
// Aufruf
RetValue = IoControlRdRam(Handle, IOCTL_Ezusb_VENDOR_REQUEST,
&VendorRequestIn, 10,
PtrBuffer, Marshal.SizeOf(Buffer),
&nBytes, 0);
}
RetByte = Buffer[0];
return RetValue;
}
Auch das genaue nachvollziehen des Beispieles mit
"fixed ( byte* PtrBuffer = Buffer )" {...}
bringt keinen Erfolg !
Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !
Grüsse Karsten!