Как правильно избавиться от пинвока / неуправляемого кода
У меня есть код, который должен вызывать ac dll, мне кажется, что этот код должен реализовывать idisposible, поскольку он касается неуправляемого кода. Я могу ошибаться, поэтому, пожалуйста, поправьте меня, если это не так.
Читая о вещах, кажется, что я должен использовать безопасные ручки. Отлично. За исключением того, что моя dll не возвращает никаких дескрипторов или intptr. Что теперь?
Подписи в основном похожи на следующие:
HRESULT _XYZFN XYZNewTrip (Trip *pTripID);
Значения аргумента:
pTripID: указатель на 4-байтовое целое число, в которое будет помещен новый дескриптор Trip
Могу ли я кое-что, как рожок для безопасности там? Кажется, может быть, трудный случай из этой статьи.
1 ответ
Если он не возвращает дескриптор, то очевидно, что вы ничего не можете освободить, поэтому IDisposable
картина была бы бесполезна.
Единственное, что:
pTripID: pointer to a 4 byte integer in which the new Trip handle will be placed
Эти pTripID
как вы их освободите? Вероятно, есть
void XYZFreeTrip(Trip tripID);
В этом случае вам придется собрать все tripID
вы получаете и освобождаете их в IDisposable
,
Сейчас если Trip
это ручка, то у вас есть два варианта:
Ваш код только x86 (потому что, например, PInvoke DLL только x86):
sizeof(int) == sizeof(int*) == IntPtr.Size
, так что вы можете использовать Wrapping Unmanaged Resources - Определение типов уровня 0 для указателей (промежуточный вариант)Ваш код x86 и x64: упаковка неуправляемых ресурсов - определение типов уровня 0 для данных без указателей (сложный случай):-((вместо
ushort
у тебя естьint
)