Решенный C# пытается читать или записывать в защищенную память, что обычно указывает на повреждение другой памяти (с обычными решениями).
Решенный C# пытается читать или записывать в защищенную память, что обычно указывает на повреждение другой памяти (с обычными решениями).

C# пытается выполнить чтение или запись в защищенную память, что обычно указывает на повреждение другой памяти.

1. Описание ошибки

Сегодня я столкнулся с ошибкой, C# пытается выполнить чтение или запись в защищенную память, что обычно указывает на повреждение другой памяти.

2. Найдите точки сообщения об ошибках и решения.

Случай 1: Чтение или запись защищены.

Без лишних слов, давайте перейдем непосредственно к поиску точки сообщения об ошибке и ее причин!

1. Файл dll должен быть написан на C++. После инкапсуляции его для вызова моей программы на C# возникает ошибка: попытка чтения или записи защищенной памяти. Обычно это указывает на то, что другая память повреждена. Тип ошибки: System.AccessViolationException.

Вызвано межпоточными операциями? Поскольку dll управляет оборудованием, ее следует привязать к дескриптору формы. Когда я работал, я работал в событии. Все знают, что событие открывает отдельный поток.

Таким образом, использование делегирования решает вышеуказанные проблемы:

Использование C# частный делегат void CloseDevDelegate();

Язык кода:javascript
копировать
    private void CloseDev()  
    {  
        if (this.InvokeRequired)  
        {  
            CloseDevDelegate closeDev = new CloseDevDelegate(CloseDev);  
            this.BeginInvoke(closeDev);  
        }  
        else  
        {  
            Program.DEVICE.CloseDev();  
        }  
    }  

Используется в событиях: CloseDev().

Все готово! Оказалось, что это ошибка, вызванная перекрестной работой COM-порта.

Ситуация 2: Возникла проблема со звонком

Иногда при вызове чужой DLL на C# происходит попытка чтения или записи защищенной памяти. Обычно это указывает на то, что другая память повреждена.

Лучше использовать указатели при передаче значений, а затем преобразовать их в C#.

Измените следующий код:

Язык кода:javascript
копировать
[DllImport("APPLISTCC.dll")]  
public static extern string TestFunc1(string param1);  
  
string ret1 = TestFunc1("text");  

После модификации:

Язык кода:javascript
копировать
[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(), чтобы освободить объекты, которые больше не используются.

Ситуация 3. Возникла проблема с добавлением элементов управления.

Многие люди сталкиваются с этой проблемой при программировании на C#. Код вообще не пишется, просто добавляется элемент управления, и во время отладки возникает ошибка AccessViolationException.

Сообщение об ошибке SharpDevelop:

Язык кода:javascript
копировать
Unhandled exception
An exception of type System.AccessViolationException was thrown:
System.AccessViolationException: Попытка прочитать или написать защищенную Память. Обычно это указывает на то, что другая Память повреждена.

На самом деле это не проблема совместимости системы, а конфликт программного обеспечения.

Возник конфликт между VS и центром управления катализатором программного обеспечения видеокарты ATI.

Удалите Catalyst Control Center и проблема будет решена.

При переустановке Catalyst Control Center существует возможность удаления.

4. Меры предосторожности и принципы

Если вы используете ресурсы NativeCode, такие как Com и ActiveX, метод принудительного выпуска отсутствует. Базовый компонент com управляет увеличением и выпуском объектов в зависимости от количества раз, когда ваш процесс вызывает компонент (выпуск объекта будет отложен, что является причиной задержки). проблема с самим комом).

Обычно вызывается принудительная сборка мусора или собственный метод переработки объектов, и эффект не очевиден.

Такой объект не освобождается, что обычно происходит, когда частота повторных вызовов приложения чрезвычайно велика, а время между вызовами меньше скорости переработки объекта, об этой ошибке будет сообщено.

Такая ситуация обычно возникает, когда организация написания собственной программы нецелесообразна.

Принудительно освободите ресурсы COM в вашей программе и вызовите метод Marshal.ReleaseComObject(), чтобы освободить объекты, которые больше не используются.и идите туда, где могут возникнуть аномалииCatch,и оставь лог,Перенесите это исключение.

Указывает, что исполняемый файл теста совместим с функцией предотвращения выполнения данных Windows.

При запуске программы, вызывающей dll, появляется сообщение «Попытка чтения или записи в защищенную память. Обычно это указывает на то, что другая память повреждена».

Дополнительную информацию см. в разделе /NXCOMPAT (совместимость с предотвращением выполнения данных).

В компилятор добавлена ​​проверка безопасности DEP. Эту проблему можно решить, отменив бит NXCOMPAT в скомпилированном exe-файле. editbin.exe /NXCOMPAT:НЕТ myexe

Также может быть проблема с самой программой: например, доступ к базе данных достигает максимального параллелизма и возникает взаимоблокировка. Или частые операции записи и чтения вызваны механизмом сборки мусора C#, то есть скорость восстановления переменных превышает скорость использования, поэтому алгоритм необходимо перерабатывать.

Если эта проблема возникает внезапно, лучше всего вернуться к предыдущей операции и повторить операцию, например удалить элемент управления и добавить его снова; Отмените регистрацию Com и зарегистрируйтесь заново, если у вас установлены другие плагины, удалите их и повторите попытку.

boy illustration
Компания Huawei вступила во второй этап и готова спешить!
boy illustration
Быстро изучите в одной статье — концепцию и технологию реализации NL2SQL для передачи данных с нулевыми затратами.
boy illustration
Как использовать SpringBoot для интеграции EasyExcel 3.x для реализации элегантных функций импорта и экспорта Excel?
boy illustration
Почему транзакция не вступает в силу, когда @Transactional добавляется в частный метод?
boy illustration
Знание создания образов Docker: подробное объяснение команды Dockerfile.
boy illustration
Псевдостатическая конфигурация ThinkPHP
boy illustration
Код изображения для загрузки апплета WeChat: последний доступный (код серверной части + код внешнего интерфейса)
boy illustration
Используйте растровое изображение Redis для реализации эффективной функции статистики регистрации пользователей.
boy illustration
[Nginx29] Обучение Nginx: буфер прокси-модуля (3) и обработка файлов cookie
boy illustration
[Весна] SpringBoot интегрирует ShardingSphere и реализует многопоточную вставку 10 000 фрагментов данных в пакетном режиме (выполнение операций с базой данных и таблицами).
boy illustration
SpringBoot обрабатывает форму данных формы для получения массива объектов
boy illustration
Nginx от новичка до новичка 01 - Установка Nginx через установку исходного кода
boy illustration
Проект flask развертывается на облачном сервере и получает доступ к серверной службе через доменное имя.
boy illustration
Порт запуска проекта Spring Boot часто занят, полное решение
boy illustration
Java вызывает стороннюю платформу для отправки мобильных текстовых сообщений
boy illustration
Практическое руководство по серверной части: как использовать Node.js для разработки интерфейса RESTful API (Node.js + Express + Sequelize + MySQL)
boy illustration
Введение в параметры конфигурации большого экрана мониторинга Grafana (2)
boy illustration
В статье «Научно-популярная статья» подробно объясняется протокол NTP: анализ точной синхронизации времени.
boy illustration
Пример разработки: серверная часть Java и интерфейсная часть vue реализуют функции комментариев и ответов.
boy illustration
Nodejs реализует сжатие и распаковку файлов/каталогов.
boy illustration
SpringBootИнтегрироватьEasyExcelСложно реализоватьExcelлистимпортировать&Функция экспорта
boy illustration
Настройка среды под Mac (используйте Brew для установки go и protoc)
boy illustration
Навыки разрешения конфликтов в Git
boy illustration
Распределенная система журналов: развертывание Plumelog и доступ к системе
boy illustration
Артефакт, который делает код элегантным и лаконичным: программирование на Java8 Stream
boy illustration
Spring Boot(06): Spring Boot в сочетании с MySQL создает минималистскую и эффективную систему управления данными.
boy illustration
Как использовать ArrayPool
boy illustration
Интегрируйте iText в Spring Boot для реализации замены контента на основе шаблонов PDF.
boy illustration
Redis реализует очередь задержки на основе zset
boy illustration
Получить текущий пакет jar. path_java получает файл jar.