2010-12-31 2 views
6

Я делаю alot interop to user32.dll на данный момент через VB.NET. Поскольку user32.dll не находится на уровне .NET, но на собственном уровне мне нужно объявить функции, используя оператор Declare. Хотя это отлично работает, я продолжаю декларировать их снова и снова.Есть ли полная библиотека оболочки user32.dll, доступная для .NET?

Я был Google, но единственным полезным сайтом, с которым я столкнулся, был pinvoke.net. Несмотря на то, что он действительно содержит информацию в определенной степени, существует множество функций, которые либо не описаны, либо содержат много частей «TODO» в документации по нему.

Поэтому мне было интересно, есть ли полная оболочка для user32.dll, доступная для .NET. Я не смог найти никого, кого я боюсь, но, возможно, я не выгляжу правильно.

ответ

5

A полный обертка для user32.dll для .NET Framework будет довольно бессмысленной. Подавляющее большинство функций, экспортируемых user32.dll, имеют соответствующие функции, которые первоначально реализованы .NET Framework. Фактически, вся .NET Framework - это просто оболочка API Windows, включая user32.dll.

Я рекомендую вам не пытаться выполнять функции P/Invoke из user32.dll, когда есть способ сделать это с помощью управляемого кода, используя функции, уже предоставленные .NET Framework. Проверьте MSDN или удобное справочное руководство .NET по вашему выбору для этого, прежде чем пытаться изобрести колесо самостоятельно.

Если и когда вы определяете, что вам нужны конкретные функции, то не имеет, тогда и только тогда вы должны рассмотреть P/Invoking для Windows API. В этом случае, поскольку вы существенно сузили объем функций, которые вы должны импортировать, для определения сигнатуры функции должна быть минимальная сумма, используя комбинацию документации MSDN, pinvoke.net и Stack Overflow. Я бы сказал, что вы сами написали этот код (теперь, когда вы урезали то, что вам нужно, до более управляемого размера), вам необходимо прочитать документацию и точно понять, как она работает. Если вы полагаетесь на код, написанный кем-то другим, нет никакой гарантии, что он написан правильно, что он следует лучшим практикам, что он реализует любую обработку ошибок или даже понимает, как он работает и как его использовать.

Наконец, я рекомендую, чтобы даже в VB.NET использовался стандартный синтаксис C# для функций P/Invoking, а не Declare. Например:

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As MenuFlags, ByVal uIDNewItem As Int32, ByVal lpNewItem As String) As Boolean 
End Function 

Есть несколько причин, почему я думаю, что это предпочтительнее:

  1. Синтаксис Declare является попыткой сохранить обратную совместимость с тем, как делать вещи VB 6. Официальный способ .NET (обычно используемый в C#) использует атрибут <DllImport>, и поскольку вы пишете новый код, ориентированный на .NET Framework, вам следует серьезно подумать об использовании официального синтаксиса. Другое преимущество здесь в том, что ваш код будет более знаком людям, которые используют C#, и они смогут больше помочь вам в ваших объявлениях. Сэмплы, которые вы найдете в Интернете, скорее всего, будут написаны таким образом, вместо использования устаревшего синтаксиса VB 6-стиля.

  2. Иногда синтаксис Declare имеет некоторое неожиданное поведение.Например, некоторые типы сортируются по-разному, чем они со стандартным синтаксисом <DllImport>. Это может быть довольно запутанным для людей, которые более знакомы со стандартным поведением .NET.

Также см. this question, рассматривающий аналогичную проблему.

+0

@Downvoter: Не забудьте оставить комментарий о том, в какой части моего ответа вы считаете неправильным? –

+0

Прежде всего, спасибо за ваше четкое объяснение. Я вижу вашу точку зрения, но не все функции user32.dll находятся в .NET Framework. Я думаю, что я продолжу просто создавать свою собственную простую оболочку с функциями, которые нужно использовать для взаимодействия, которые я использую больше всего. Наконец, однако, я не понимаю, почему атрибут DllImport может быть benificial над оператором Declare. Я предполагаю, что у VB.NET есть свое отдельное ключевое слово Declare для таких вещей, которое также яснее, на мой взгляд, чем обозначение, которое вы используете. – pimvdb

+0

@pimvdb: Я понимаю необходимость P/вызывать определенные функции. У меня есть большая библиотека оберток для продвинутых вещей, таких как низкоуровневые системные перехватчики. Я просто заметил в вашем вопросе, что вы ищете * полную * оболочку, и я думаю, что это было бы ошибкой, учитывая, сколько функций уже реализовано в управляемом коде для .NET Framework. И я обновил свой ответ по нескольким причинам, почему я рекомендую '' over 'Declare'. –

1

Существует несколько автоматических P/Invoke signature generators, которые могут вам помочь.

+0

Вижу, спасибо. Я прав, хотя, думая, что нет простой DLL обертки? – pimvdb

+0

По крайней мере, я его никогда не видел. Вероятно, это получило бы довольно _huge_ и сделало бы ваше приложение излишне большим. Я просто знаю, что оболочка mshtml составляет около 7 МБ, и это всего лишь одно приложение. Другая причина может заключаться в том, что разные ОС имеют разные (дополнительные) наборы функций в файле user32.dll. –

1

Я бы просто использовал предварительно созданную упаковку под названием Managed Windows API. В нем нет всего, но в нем есть все. При использовании в связи с PInvoke.net Visual Studio Add-in у вас должен быть довольно автоматический способ решения этой проблемы.

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