C # и пустые указатели - PullRequest
       54

C # и пустые указатели

7 голосов
/ 20 ноября 2011

Я пишу свое первое приложение на C #, но, по счастливой случайности, я должен использовать указатели void (работая с DLL, которая возвращает дескрипторы). Из того, что я прочитал, есть несколько вариантов:

  1. Небезопасный код, например, см. http://www.c -sharpcorner.com / UploadFile / gregory_popek / WritingUnsafeCode11102005040251AM / WritingUnsafeCode.aspx

  2. В программе на C # пишу в моей функции declerations IntPtr вместо void *. например.: public static extern char SupportsWhwhat (IntPtr h);

  3. Использование ссылки, например: public static extern char SupportsWhwhat (ref h);

Следует также отметить, что мне нужно перенаправлять информацию туда и обратно между DLL и C # приложением.

В Google впервые появился небезопасный вариант, но по какой-то причине написание ключевого слова небезопасно до того, как все мои функции просто не будут работать.

Есть рекомендации?

Ответы [ 3 ]

7 голосов
/ 20 ноября 2011

Как правило, для ситуаций маршалинга, использование IntPtr было бы предпочтительным подходом здесь.Это разрешено в безопасном коде и очень ясно показывает, что вы намерены маршалировать указатель туда-сюда.

Это то, сколько BCL представляет дескрипторы.Например, вы можете создать курсор из IntPtr , представляющего собственный дескриптор.

0 голосов
/ 20 ноября 2011

Unsafe - это инструкция для компилятора, что в этом контексте будут указатели. От MSDN

В общеязыковой среде выполнения (CLR) небезопасный код называется непроверяемый код. Небезопасный код в C # не обязательно опасен; это просто код, безопасность которого не может быть подтверждена CLR . CLR поэтому будет выполнять небезопасный код только в том случае, если он полностью доверен сборка. Если вы используете небезопасный код, вы обязаны обеспечить что ваш код не представляет угрозы безопасности или ошибки указателя.

Я использовал его с .net 1.1, когда использовал C ++ API в C #, который имел обыкновение общаться с мэйнфреймами через COM-порт ПК:)

0 голосов
/ 20 ноября 2011

Основное правило - если вам нужно взаимодействовать с ним как с указателем, в c # используйте небезопасный код / ​​указатели. Если вы можете рассматривать его как непрозрачный дескриптор, используйте IntPtr. Вы должны использовать ref, если вам нужно передать указатель на структуру в неуправляемый код.

...