Я общаюсь с библиотекой сторонних разработчиков, где мне нужно приобрести и освободить неуправляемый ресурс. После некоторого чтения я пришел к выводу, что лучший и «правильный» способ управления ссылкой ресурса был либо в объекте SafeHandle
, либо в CriticalHandle
.Маршаллинг без знака для SafeHandle
Моя проблема возникает из-за того, что дескрипторы, возвращенные третьей стороной, представляют собой неподписанные короткие числовые значения, а не указатели. Если я укажу MarshalAsAttribute
на возвращаемом дескрипторе, я получаю MarshalDirectiveException
(CriticalHandles не должен иметь атрибут MarshalAs и не может использоваться в массивах).
Вот то, что я СУЖДЕНИЕ:
- Marshal ручками в числовом формате и завернуть их в
CriticalHandle
черезCriticalhandle.SetHandle
метод. Это позволяет потенциально утечка дескриптора, если возникает исключение между получением ссылки и ее инкапсулированием. - Маршал и хранить ручки в их числовом формате. Имейте оснастку типа
CriticalFinalizerObject
. Это позволяет потенциально утечка дескриптора, если возникает исключение между получением ссылки и ее инкапсулированием. - Маршал обрабатывает маркеры
SafeHandle
какIntPtr
(позволяя заполнять квази-мусором наиболее значимые 2 байта). ВнеситеDangerousGetHandle
назад к короткому (отбрасывая наиболее значительные 2 байта мусора) каждый раз, когда мне нужно вызвать собственный метод с помощьюSafeHandle
. Это предотвратит любые потенциальные утечки рукоятки, но очень громоздки и имеет вид использования грубой силы, чтобы сделать неправильное решение.
Как обращаться с этими «ручками»?
Вы можете сделать SafeHandle работать, если ваш собственный код 32-бит. Короткий аргумент всегда получает значение int в вызове функции C или C++. IntPtr не будет путать его. –
Это немного успокаивает меня, но это оставляет мне интересно, почему дополнительные данные иногда заполняются в наиболее значимые 2 байта в возвращаемом значении. IE: Иногда верхние 2 байта содержат битовую схему всех 0 и других раз содержат битовую схему 0x0091.Хотя я знаю сценарии, которые приводят к обоим обстоятельствам, я не знаю, что представляют собой дополнительные биты. Возможно, это что-то особенное для моей библиотеки, которое я должен исследовать. Благодарю. –
@ HansPassant Это работало очень хорошо для меня. Можете ли вы опубликовать это как ответ, чтобы я мог принять его? –