Как правильно избавиться от пинвока / неуправляемого кода

У меня есть код, который должен вызывать 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)

Другие вопросы по тегам