Попытка чтения или записи защищенной памяти. Это часто является признаком того, что другая память нарушена
Всем привет
я уже давно занимаюсь этим, у меня есть приложение c# winform, которое вызывает неуправляемую 32-битную библиотеку dll c++, но всякий раз, когда я пытаюсь ее вызвать, приложение либо падает, либо приносит исключительную ошибку
"Попытка чтения или записи защищенной памяти. Это часто является признаком того, что другая память нарушена"
ниже приведен пример моего кода, я делаю что-то не так!
Записи:
я попытался изменить свою целевую платформу на X86
я даже попытался снять флажок "подавить загрузку модуля оптимизации JIT"
но никто не решил проблему
любая помощь будет очень признательна.
Что я уже пробовал:
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace Unit1 { public partial class TForm1: Form { public TForm1() { InitializeComponent(); } private bool rdCard() { bool result = false; int st; //result = false; // Units.Unit1.bufCard = ""; Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; st = Units.Unit1.ReadCard(Units.Unit1.flagUSB, Units.Unit1.bufCard); if (st != 0) { MessageBox.Show(("Read Card Failure" + '\n' + (st).ToString() + "the buf: " + Units.Unit1.bufCard), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error); return result; } if (Units.Unit1.bufCard.Substring(0, 6) != "551501") { MessageBox.Show(("No Valid Card On Reader" + '\n' + Units.Unit1.bufCard), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); return result; } else { result = true; Cursor.Current = System.Windows.Forms.Cursors.Default; return result; } } // Read Card Data public void BitBtn3Click(System.Object Sender, System.EventArgs _e1) { if (!rdCard()) { return; } // Read Card edt_CardData.Text = Units.Unit1.bufCard; //@ Unsupported function or procedure: 'copy' MessageBox.Show((("Card ID£º" + Units.Unit1.bufCard.Substring(25, 8))), "Note", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); } } } namespace Unit1.Units { public class Unit1 { public static TForm1 Form1 = null; public static byte flagUSB = 0; // Reader Type,0--USB,1--proUSB public static int st = 0; public static string bufCard; [DllImport("proRFL.DLL")] public static extern int ReadCard(byte fUSB, string Buffer); [DllImport("proRFL.DLL")] public static extern int CardErase(byte fUSB, int dlsCoID, string cardHexStr); } // end Unit1 }
FranzBe
Вы передаете пустую строку в параметр buffer функции ReadCard (). Вы уверены, кто выделяет память для строки? Функция неуправляемой библиотеки Dll? Я бы попытался присвоить некоторое пространство переменной 'bufCard' перед переходом к функции ReadCard ().