c #, используя const с DllImport - PullRequest
       3

c #, используя const с DllImport

3 голосов
/ 14 января 2012

У меня есть пример кода из SDK, DLL написана на C и требует следующее:

int getAttribute (const RawDevControl * control, атрибут RawDevAttribute *)

Я использую

[DllImport(@"Dev.dll",
SetLastError = true)]
internal static extern int getAttribute(const RControl *control, RAttribute *attribute);

Но, конечно, вы не можете использовать const как тип при определении этой ссылочной функции.

Как мне сделать это с помощью c #?

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Поскольку в C # нет концепции константных ссылок, вам не нужно об этом беспокоиться.На стороне DLL код все еще будет думать, что у вас есть константный указатель.Таким образом, ваш импорт изменяется следующим образом:

[DllImport(@"Dev.dll", SetLastError = true)]
internal static extern int getAttribute(RControl control, RAttribute attribute);

Это, конечно, предполагает, что и RControl и RAttribute были определены в C #Если они являются структурами, следуйте примерам в MSDN для определения структур для использования с P / Invoke.Если они классы, это другой набор проблем.В этом случае лучше, если классы основаны на COM.

2 голосов
/ 14 января 2012

Объявление обещает, что функция не изменяет переданный объект.Так что воспользуйтесь этим, скажите маршаллеру pinvoke, что нет смысла копировать его обратно.Примените атрибут [In]:

[DllImport(@"Dev.dll", SetLastError = true)]
static extern int getAttribute([In] ref RControl control, out RAttribute attribute);

Пропустите ключевое слово ref или out , если вы объявили типы аргументов как классы вместо структур.

...