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
Есть несколько причин, почему я думаю, что это предпочтительнее:
Синтаксис Declare
является попыткой сохранить обратную совместимость с тем, как делать вещи VB 6. Официальный способ .NET (обычно используемый в C#) использует атрибут <DllImport>
, и поскольку вы пишете новый код, ориентированный на .NET Framework, вам следует серьезно подумать об использовании официального синтаксиса. Другое преимущество здесь в том, что ваш код будет более знаком людям, которые используют C#, и они смогут больше помочь вам в ваших объявлениях. Сэмплы, которые вы найдете в Интернете, скорее всего, будут написаны таким образом, вместо использования устаревшего синтаксиса VB 6-стиля.
Иногда синтаксис Declare
имеет некоторое неожиданное поведение.Например, некоторые типы сортируются по-разному, чем они со стандартным синтаксисом <DllImport>
. Это может быть довольно запутанным для людей, которые более знакомы со стандартным поведением .NET.
Также см. this question, рассматривающий аналогичную проблему.
@Downvoter: Не забудьте оставить комментарий о том, в какой части моего ответа вы считаете неправильным? –
Прежде всего, спасибо за ваше четкое объяснение. Я вижу вашу точку зрения, но не все функции user32.dll находятся в .NET Framework. Я думаю, что я продолжу просто создавать свою собственную простую оболочку с функциями, которые нужно использовать для взаимодействия, которые я использую больше всего. Наконец, однако, я не понимаю, почему атрибут DllImport может быть benificial над оператором Declare. Я предполагаю, что у VB.NET есть свое отдельное ключевое слово Declare для таких вещей, которое также яснее, на мой взгляд, чем обозначение, которое вы используете. – pimvdb
@pimvdb: Я понимаю необходимость P/вызывать определенные функции. У меня есть большая библиотека оберток для продвинутых вещей, таких как низкоуровневые системные перехватчики. Я просто заметил в вашем вопросе, что вы ищете * полную * оболочку, и я думаю, что это было бы ошибкой, учитывая, сколько функций уже реализовано в управляемом коде для .NET Framework. И я обновил свой ответ по нескольким причинам, почему я рекомендую '' over 'Declare'. –