Чистая неуправляемая память - PullRequest
2 голосов
/ 31 августа 2009

Всякий раз, когда я использую одну функцию из неуправляемой dll в Usercontrol, я получаю эту ошибку. «System.AccessViolationException: попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена». Но это происходит только в том случае, если я использую эту функцию столько раз. Но мне нужно использовать эту функцию каждые 3 минуты. Любые идеи высоко ценится. Спасибо.

Ответы [ 2 ]

1 голос
/ 31 августа 2009

Исходя из того, что вы опубликовали с очень небольшим количеством информации, мой первый инстинктивный ответ был бы о том, что неуправляемый dll, который вы используете, если он был написан третьей стороной, имеет ошибки обработки памяти внутри него. Если это входящая в состав Windows DLL, вам нужно больше изучить, как вы ее используете, или какие ресурсы она использует, так как эта ошибка, скорее всего, вызвана вашим кодом, если это Windows DLL.

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

0 голосов
/ 01 сентября 2009

Управление памятью в Marshalling - сложная задача. Вы даете очень мало информации, поэтому я могу ответить только в общем:

Te Interop marshaller использует CoTaskMemFree и CoTaskMemAlloc для выделения памяти. Если ваша DLL выделяет память, и .NEt должен освободить ее (или наоборот), вы должны использовать эту функцию. Если память выделяется с помощью new или malloc () и освобождается с помощью delete или free (), библиотека должна предоставить некоторую функцию Cleanup (), чтобы справиться с этим. Чтобы запретить маршаллеру освобождение памяти, вы должны объявить свои функции с IntPtr как тип данных параметра / возвращаемого значения вместо использования строки или чего-либо еще.

Рассмотрим следующие объявления:

   [ DllImport( "Your.dll", CharSet=CharSet.Auto )]
   public static extern string GetSomeString();

   [ DllImport( "Your.dll", CharSet=CharSet.Auto )]
   public static extern IntPtr GetSomeString();

Первая функция должна возвращать строку, выделенную с помощью CoTaskMemAlloc (), и она освобождается .NET Marshaller. Вторая функция может возвращать строку, выделенную с помощью malloc или delete, но память не освобождается автоматически. Вы должны вызвать какую-то функцию FreeMemory (IntPtr), которую должна предоставить библиотека.

Не забудьте прочитать: .NET Маршалинг Поведение по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...