A complete обертка для user32.dll для .NET Framework была бы довольно бессмысленной.Подавляющее большинство функций, экспортируемых user32.dll, имеют соответствующие функции, которые изначально реализованы в .NET Framework.Фактически весь .NET Framework - это просто оболочка для Windows API, включая user32.dll.
Я рекомендую вам не пытаться использовать функции P / Invoke из user32.dll, когда есть способ сделать это.это через управляемый код с использованием функциональности, уже предоставленной .NET Framework.Сначала проверьте MSDN или удобное справочное руководство .NET по вашему выбору, прежде чем пытаться изобретать велосипед самостоятельно.
Если и когда вы определите, что конкретная функция (и) вам нужна, не имеет собственный эквивалент, тогда и только тогда вы должны рассмотреть P / Invoking Windows API.В этом случае, поскольку вы существенно сузили объем функций, которые необходимо импортировать, для определения сигнатуры функции с использованием комбинации документации MSDN потребуется всего лишь минимальный объем pinvoke.net и переполнение стека.Я бы сказал, что преимущество написания этого кода самостоятельно (теперь, когда вы урезали то, что вам нужно, до более управляемого размера) заключается в том, что вам фактически необходимо прочитать документацию и понять, как именно он работает.Если вы полагаетесь на код, написанный кем-то другим, нет гарантии, что он написан правильно, что он следует передовым методам, что он реализует любую обработку ошибок, или даже что вы понимаете, как он работает и как его использовать.
* 1012И наконец, я рекомендую, чтобы даже в 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.
Также см. этот вопрос , посвященный аналогичной проблеме.