.net - AccessViolation при первом взаимодействии с нативной DLL - PullRequest
1 голос
/ 27 января 2010

Это немного странно, и я впервые попал в мир .net, так что я надеюсь, что мне не хватает чего-то фундаментального :) Справочная информация:

У меня есть встроенная / Qt c ++ DLL, которую я упаковываю для использования в .NET, C # в этом случае. У меня есть приложение Qt, которое успешно использует эту DLL, без утечек памяти и т. Д. Я создал оболочку c ++ / CLI для этой библиотеки и через нее могу успешно вызывать нативный код. Однако я заметил, что в зависимости от того, как я впервые взаимодействую с управляемой DLL (и, следовательно, с собственной DLL), я вижу исключения AccessViolation.

Если я сначала выделю объект из собственной библиотеки DLL в куче процесса (не в .net), все будет работать, как и ожидалось. Но если я взаимодействую с объектом из собственной библиотеки DLL, создавая его в стеке, а затем выделяю собственный объект в куче, я позже получаю исключения AccessViolation в несвязанном собственном коде DLL. На самом деле мне нужно только выделить собственный объект (и никогда больше не ссылаться на него), чтобы увидеть эти ошибки.

Конечно, проблема стека и кучи может представлять собой красную сельдь, но она воспроизводима на 100%, так что это, по крайней мере, хорошее руководство для выслеживания. Какие-нибудь советы? Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 января 2010

Я согласен с Орионом Эдвардсом, скорее всего, это проблема GC. Чтобы решить эту проблему, вам нужно «закрепить» объект, чтобы GC не собирал его. Здесь есть свои подводные камни, так что будьте осторожны.

См. Эту статью для получения дополнительной информации:

Копирование и закрепление

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

0 голосов
/ 27 января 2010

Как вы распределяете вещи в куче?

Если вы выделяете управляемые объекты (gcnew и т. Д.) И затем передаете их неуправляемому коду или просто передаете указатели на существующие управляемые объекты в неуправляемый код, тогда сборщик мусора приходит и собирает или перемещает их. Это приводит к тому, что ваш неуправляемый код имеет указатели мусора, следовательно (наиболее вероятно) нарушение доступа

Нам почти наверняка понадобится увидеть фрагмент кода, чтобы оказать гораздо большую помощь. Приветствия

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