.NET Platform Invoke поддерживает объявление типов указателей как IntPtr.Например следующееделать.
Я использовал шаблон, в котором я объявляю небезопасную структуру типом непрозрачного указателя.Я могу сохранить этот тип указателя в управляемом объекте, и компилятор может проверить его для меня.Например:
class Foo {
unsafe struct FOO {}; // opaque type
unsafe FOO *my_foo;
class if {
[DllImport("mydll")]
extern static unsafe FOO* get_foo();
[DllImport("mydll")]
extern static unsafe void do_something_foo(FOO *foo);
}
public unsafe Foo() {
this.my_foo = if.get_foo();
}
public unsafe do_something_foo() {
if.do_something_foo(this.my_foo);
}
ПРИМЕЧАНИЕ. Я не пытаюсь упорядочить структуру.DLL предоставляет непрозрачный указатель, к которому я не должен прикасаться, мне просто нужно предоставить его для будущих вызовов DLL.
Я знаю, что опубликованный способ сделать это - IntPtr, но я нене нравится использовать нетипизированный указатель.Когда есть несколько типов указателей, перемещающихся между управляемым и собственным кодом, использование IntPtrs очень опасно.Использование моих непрозрачных типов структурных указателей для проверки типов является хорошей находкой.
Я не сталкивался с какими-либо проблемами при использовании этой техники на практике.Однако я также не видел примеров того, чтобы кто-нибудь использовал эту технику, и мне интересно, почему.Есть ли какая-либо причина, по которой приведенный выше код недопустим в глазах среды выполнения .NET?
Мой главный вопрос о том, как система .NET GC обрабатывает «небезопасное FOO * my_foo».Я надеюсь, что поскольку базовый тип является структурой, а он объявлен небезопасным, GC проигнорирует его.
Является ли этот указатель чем-то, что система GC попытается отследить, или она просто проигнорирует его?Безопасно ли использовать мою технику вместо IntPtr?