C# пытается выполнить чтение или запись в защищенную память, что обычно указывает на повреждение другой памяти.
Сегодня я столкнулся с ошибкой, C# пытается выполнить чтение или запись в защищенную память, что обычно указывает на повреждение другой памяти.
Без лишних слов, давайте перейдем непосредственно к поиску точки сообщения об ошибке и ее причин!
1. Файл dll должен быть написан на C++. После инкапсуляции его для вызова моей программы на C# возникает ошибка: попытка чтения или записи защищенной памяти. Обычно это указывает на то, что другая память повреждена. Тип ошибки: System.AccessViolationException.
Вызвано межпоточными операциями? Поскольку dll управляет оборудованием, ее следует привязать к дескриптору формы. Когда я работал, я работал в событии. Все знают, что событие открывает отдельный поток.
Таким образом, использование делегирования решает вышеуказанные проблемы:
Использование C# частный делегат void CloseDevDelegate();
private void CloseDev()
{
if (this.InvokeRequired)
{
CloseDevDelegate closeDev = new CloseDevDelegate(CloseDev);
this.BeginInvoke(closeDev);
}
else
{
Program.DEVICE.CloseDev();
}
}
Используется в событиях: CloseDev().
Все готово! Оказалось, что это ошибка, вызванная перекрестной работой COM-порта.
Иногда при вызове чужой DLL на C# происходит попытка чтения или записи защищенной памяти. Обычно это указывает на то, что другая память повреждена.
Лучше использовать указатели при передаче значений, а затем преобразовать их в C#.
Измените следующий код:
[DllImport("APPLISTCC.dll")]
public static extern string TestFunc1(string param1);
string ret1 = TestFunc1("text");
После модификации:
[DllImport("APPLISTCC.dll")]
public static extern IntPtr TestFunc1(IntPtr par1);
IntPtr ptrIn = Marshal.StringToHGlobalAnsi("text");
IntPtr ptrRet = TestFunc1(ptrIn);
string retlust = Marshal.PtrToStringAnsi(ptrRet);
Принудительно освободите ресурсы COM в вашей программе и вызовите метод Marshal.ReleaseComObject(), чтобы освободить объекты, которые больше не используются.
Многие люди сталкиваются с этой проблемой при программировании на C#. Код вообще не пишется, просто добавляется элемент управления, и во время отладки возникает ошибка AccessViolationException.
Сообщение об ошибке SharpDevelop:
Unhandled exception
An exception of type System.AccessViolationException was thrown:
System.AccessViolationException: Попытка прочитать или написать защищенную Память. Обычно это указывает на то, что другая Память повреждена.
На самом деле это не проблема совместимости системы, а конфликт программного обеспечения.
Возник конфликт между VS и центром управления катализатором программного обеспечения видеокарты ATI.
Удалите Catalyst Control Center и проблема будет решена.
При переустановке Catalyst Control Center существует возможность удаления.
Если вы используете ресурсы NativeCode, такие как Com и ActiveX, метод принудительного выпуска отсутствует. Базовый компонент com управляет увеличением и выпуском объектов в зависимости от количества раз, когда ваш процесс вызывает компонент (выпуск объекта будет отложен, что является причиной задержки). проблема с самим комом).
Обычно вызывается принудительная сборка мусора или собственный метод переработки объектов, и эффект не очевиден.
Такой объект не освобождается, что обычно происходит, когда частота повторных вызовов приложения чрезвычайно велика, а время между вызовами меньше скорости переработки объекта, об этой ошибке будет сообщено.
Такая ситуация обычно возникает, когда организация написания собственной программы нецелесообразна.
Принудительно освободите ресурсы COM в вашей программе и вызовите метод Marshal.ReleaseComObject(), чтобы освободить объекты, которые больше не используются.и идите туда, где могут возникнуть аномалииCatch,и оставь лог,Перенесите это исключение.
Указывает, что исполняемый файл теста совместим с функцией предотвращения выполнения данных Windows.
При запуске программы, вызывающей dll, появляется сообщение «Попытка чтения или записи в защищенную память. Обычно это указывает на то, что другая память повреждена».
Дополнительную информацию см. в разделе /NXCOMPAT (совместимость с предотвращением выполнения данных).
В компилятор добавлена проверка безопасности DEP. Эту проблему можно решить, отменив бит NXCOMPAT в скомпилированном exe-файле. editbin.exe /NXCOMPAT:НЕТ myexe
Также может быть проблема с самой программой: например, доступ к базе данных достигает максимального параллелизма и возникает взаимоблокировка. Или частые операции записи и чтения вызваны механизмом сборки мусора C#, то есть скорость восстановления переменных превышает скорость использования, поэтому алгоритм необходимо перерабатывать.
Если эта проблема возникает внезапно, лучше всего вернуться к предыдущей операции и повторить операцию, например удалить элемент управления и добавить его снова; Отмените регистрацию Com и зарегистрируйтесь заново, если у вас установлены другие плагины, удалите их и повторите попытку.