.Net и неуправляемые DLL -> проблемы с памятью - PullRequest
2 голосов
/ 13 ноября 2011

Я создаю неуправляемую DLL в Visual Studio 2010.

Чтобы протестировать мою DLL, я создал другой проект с помощью Visual Basic и приложил его к решению.

Код VB вызывает мою функцию InstallHook в DLL, передавая делегат функции обратного вызова в VB. Затем DLL создает ловушку, и каждый раз, когда нажимается клавиша, вызывается обратный вызов VB, получающий ключ и некоторые другие параметры в качестве аргумента.

Ну, проблема в том, что после нажатия некоторых клавиш, и буфер в обратном вызове VB достигает определенного размера, происходит сбой программы. Чтобы быть более точным, когда обратный вызов вызывается в последний раз, и он записывает в свой буфер в VB, это похоже на то, что он где-то перекрывается, потому что в следующий раз, когда обратный вызов будет вызван в DLL, сбой программы не достигнет обратный вызов (указатель в dll в порядке)

Я не очень хорошо понимаю архитектуру .Net, и я не знаю точно, что может быть не так, но я очень уверен в написанном мною коде, и проблема должна быть чем-то техническим с управлением памятью в .Net.

Редактировать: Я забыл сказать, что если я вызываю обратный вызов из кода VB, то он работает нормально. Обратный вызов обычно вызывается из WndProc, установленного в том же окне.

Спасибо ....

1 Ответ

3 голосов
/ 13 ноября 2011

указатель в dll в порядке

Я подозреваю, что это проблема. Если вы передаете адрес в собственную подпрограмму, а затем используете его за пределами одного вызова метода, вы рискуете.

Проблема в том, что .NET использует компактный сборщик мусора. Это означает, что среда выполнения может «переместить» буфер в совершенно другое место между вызовами методов. Таким образом, в какой-то момент, когда вы пишете в него, он может оказаться в совершенно другом месте.

Вы можете обойти это, выделив и управляя памятью самостоятельно с помощью класса Marshal . Кроме того, вы можете использовать класс GCHandle для закрепления памяти и предотвращения ее перемещения .

...