Можно ли импортировать нативный метод в .NET (используя P / Invoke), чтобы взаимодействие автоматически вызывало Win32Exception? - PullRequest
0 голосов
/ 11 апреля 2011

Многочисленные методы Win32 используют SetLastError, чтобы указать на ошибку.В .NET я бы использовал такой метод, например, так:

if (!SomeNativeBoolMethod(...))
{
  throw new Win32Exception();
}

ИЛИ

var res = SomeNativeIntMethod(...);
if (res != 0)
{
  throw new Win32Exception(res);
}

Мне было интересно, может ли инфраструктура взаимодействия .NET сделать это для меня.В этом случае я бы импортировал SomeNativeBoolMethod и SomeNativeIntMethod как пустые методы.(Для SomeNativeIntMethod это должно быть необязательным, в зависимости от того, хочу ли я видеть положительные коды возврата или нет).

Возможно ли это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Думали ли вы в аспектно-ориентированном программировании?Возможно, вы можете перехватить вызовы с помощью атрибута, а затем использовать общий шаблонный код для генерации исключения.

Использование инфраструктуры .NET будет немного громоздким, поскольку вам придется:

  1. Создание производного класса MarshalByRef или ContextBoundObject
  2. Создание методов экземпляров, которые будут выполнять перехват
  3. Переадресация вызовов на импортированные методы Win32

Есть AOPфреймворки (блок приложения Microsoft Policy Injection, Windsor AOP, ...), которые могут помочь вам в этом.

Другой вариант (который я бы попробовал в первую очередь) использует PostSharp , который можетперехватывать вызовы статических методов (намного лучшая производительность во время выполнения, чем прокси во время выполнения).Вы можете реализовать свой пользовательский атрибут и перехватывать вызовы Win32, проверять GetLastError () и вызывать исключение, если требуется.

0 голосов
/ 11 апреля 2011

Похоже, вы ищете функцию, похожую на функцию взаимодействия COM, посредством которой подписи HRESULT преобразуются в методы генерации исключений.Если так, извините, что эта функция не существует.

Скорее всего, из-за множества различных способов, с помощью которых Win32 API сообщают о сбоях.Универсального соглашения просто нет.В отличие от COM, где наиболее определенно существует универсальное соглашение для всего, что возвращает HRESULT.

Лучше всего ввести вспомогательную функцию, которая упаковывает вызовы PInvoke, проверяет код ошибки и выбрасывает соответствующим образом.

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