P / Invoke и состояние неуправляемой DLL - PullRequest
8 голосов
/ 17 мая 2011

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

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

Ответы [ 2 ]

2 голосов
/ 07 сентября 2012

Среда выполнения .Net обычно не выгружает ваши DLL-файлы pinvoke самостоятельно, так как не может знать, безопасно ли это делать, например, содержат ли они состояние, включая глобальные переменные, такие как статические строки или что-то подобное.

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

Например, если вызываемый объект является функцией ac в dll, ожидающей строку ANSI, и вы позволяете pinvoke взять строку C #, она будет маршалировать строку Unicode C # в строку ASNI и будет ожидать получения вернуть эту память после завершения вызова, даже если эта строка пришла из статического C #. Даже если это не так, любой указатель на управляемую память следует считать недействительным после вызова, если только вы не закрепляете эту память.

Вот какая веревка, чтобы повеситься:) Используйте это с осторожностью. Это будет привязывать управляемую память на неопределенный срок, и я не рекомендую делать это. DLL, имеющая свою собственную копию строки, или управляемая сторона, имеющая свою собственную копию, не будет величайшим преступлением в области программирования, когда-либо совершенным. И с практической точки зрения было бы намного быстрее, если бы каждый из них имел по одному в своей куче, если бы он действительно был статичным. Функция C должна сделать свою собственную копию до возврата вызова.

0 голосов
/ 28 июня 2011

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

Один комментатор предполагает, что вы можете удалить статический файл, выгружая библиотеку, в которой он находится, это не всегда возможно (вы не можете выгрузить основную библиотеку c), но может работать на вас.

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