ich hab nach längerer Zeit mal wieder meine Anlage angeschmissen und mir natürlich den aktuellen Treiber für die Easylase runtergeladen. Habe dann gleich mal Lasertennis und Astroids ausprobiert und war schon ziemlich begeistert

Kurzum inspiriert davon wollte ich mich mal dran machen und was eigenes, bevorzugt in C#, programmieren. Ich stehe noch ganz am Anfang und komme leider nicht so recht weiter.
In der Dokumentation der DLL ist die Funktion zum Schreiben eines Frames wie folgt definiert:
Code: Alles auswählen
Function EasyLaseWriteFrame(CardNumber:integer, Datapointer:pointer,
Byteanzahl:integer, Punktspeed :word):boolean
Code: Alles auswählen
public partial class Form1 : Form
{
[DllImport("easylase.dll")]
public static extern int EasyLaseGetCardNum();
[DllImport("easylase.dll")]
public static unsafe extern bool EasyLaseWriteFrame(int cardNumber, byte[] datapointer, int bytecount, int speed);
[DllImport("easylase.dll")]
public static extern bool EasyLaseStop(int cardNumber);
[DllImport("easylase.dll")]
public static extern bool EasyLaseClose();
private int easylaseCount;
public unsafe Form1()
{
InitializeComponent();
easylaseCount = EasyLaseGetCardNum();
if (easylaseCount > 0)
{
byte[] frame = new byte[] { 0, 0, 0, 0, 255, 0, 0, 255, 128, 0, 0, 0, 255, 0, 0, 255 };
EasyLaseWriteFrame(0, frame, 16, 5000);
}
}
private void Form_Closing(object sender, EventArgs e)
{
if (easylaseCount > 0)
{
EasyLaseStop(0);
EasyLaseClose();
}
}
}
Das Funktioniert nicht

Ich hab es auch schon mit diversen Varianten versucht z.B.Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Code: Alles auswählen
[DllImport("easylase.dll")]
public static unsafe extern bool EasyLaseWriteFrame(int cardNumber, byte *[]datapointer, int bytecount, int speed);
byte []frame = new byte[] { 0, 0, 0, 0, 255, 0, 0, 255, 128, 0, 0, 0, 255, 0, 0, 255 };
fixed(byte *ptr = frame);
EasyLaseWriteFrame(0, ptr, 16, 5000);
EasyLaseWriteFrame(...) Error Der Name ptr ist im aktuellen Kontext nicht vorhanden.
Kann mir vielleicht jemand auf die Sprünge helfen? Eigentlich wäre ein zweidimensionales Array später doch auch einfacher zu handhaben oder? n*8 Byte. Wie macht man sowas mit Pointern in C#?
Ohne ist ja nicht schwer:
Code: Alles auswählen
byte[,] 3x3array = byte[,] {{0,1,2}, {0,1,2}, {1,2,3}};