Взаимодействующий вопрос о передаче структуры по ref, нулевому указателю и IntPtr - PullRequest
3 голосов
/ 27 декабря 2010

Коллеги,

Преамбула. Мой вопрос больше о лучших практиках. Я знаю один обходной путь. Это первый раз, когда мне приходится иметь дело с взаимодействием в C #, и в то же время я написал довольно много кода на C и C ++.

Мне нужно 2 раза вызвать функцию, предоставляемую неуправляемой DLL. Функция принимает указатель на структуру в качестве аргумента. 1-й раз мне нужно передать указатель null. 2-й раз мне нужно передать указатель на экземпляр структуры.

Функция имеет 6 параметров, поэтому ниже приведены упрощенные объявления, которые работают для целей этого вопроса. (Я могу опубликовать подробности, если кому-то интересно.) Вот 1-й вариант декларации:

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
   static extern bool foo(ref NEEDED_STRUCT_TYPE sDataStruct);

Мне это нравится, потому что оно строго типизировано для NEEDED_STRUCT_TYPE. Но чтобы передать нулевой указатель, мне пришлось изменить объявление на

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
   static extern bool foo(IntPtr sDataStruct);

Теперь я могу передать IntPtr.Zero для указателя null, но параметр больше не является строго типизированным. В данной ситуации есть ли способ иметь и строго типизированный параметр, и возможность передавать нулевой указатель?

Любые предложения, идеи или рекомендации действительно приветствуются!

Ура,
- Ник

1 Ответ

3 голосов
/ 27 декабря 2010

Нередко используется метод-оболочка с точным API, который вы хотите предоставить (строго типизированный и т. Д.), И затем этот метод-оболочка вызывает метод DllImport, который является закрытым.Другими словами, нет причин, по которым необработанному методу нужно принудительно управлять управляемым API.

...