2012-01-14 3 views
3

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

INT GetAttribute (Const RawDevControl * контроль, RawDevAttribute * атрибут)

I с использованием

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

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

Как я могу сделать эту работу с C#?

ответ

4

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

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

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

2

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

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

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

Смежные вопросы