Вызов P-invoke завершается неудачно, если заранее выделено слишком много памяти - PullRequest
0 голосов
/ 16 мая 2010

Я получил p-invoke вызов неуправляемой DLL, которая не работала в моем приложении WPF, но не в простом начальном приложении WPF. Я попытался выяснить, в чем проблема, но в конце концов пришел к выводу, что если я выделю слишком много памяти перед выполнением вызова, вызов завершится неудачно. У меня было два отдельных блока кода, оба из которых были бы успешными сами по себе, но это вызвало бы сбой, если бы оба были запущены. (Они не имели никакого отношения к тому, что пытается сделать вызов p-invoke).

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

Насколько я могу судить, сбой происходит в динамически загруженной вторичной DLL-библиотеке, из которой вызывается p-файл. Может ли это иметь какое-то отношение к этому?

Ответы [ 2 ]

0 голосов
/ 16 мая 2010

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

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

0 голосов
/ 16 мая 2010

Снимок в темноте, учитывая, что не так много информации для работы.

Возможно ли, что неуправляемую DLL нужно загружать по определенному базовому адресу и когда вы выделяете слишком много памяти или другие сборкизагружены, DLL не может загрузить по правильному адресу.

http://msdn.microsoft.com/en-us/library/w368ysh2.aspx

...