Существует ли полная библиотека-оболочка user32.dll для .NET? - PullRequest
6 голосов
/ 01 января 2011

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

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

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

Ответы [ 4 ]

5 голосов
/ 01 января 2011

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

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

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

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

Также см. этот вопрос , посвященный аналогичной проблеме.

1 голос
/ 28 сентября 2011

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

1 голос
/ 01 января 2011

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

0 голосов
/ 10 октября 2014

Я надеюсь, что следующий URL поможет вам.

http://mwinapi.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...