Как найти значение LastError при отладке .net процесса? - PullRequest
4 голосов
/ 22 мая 2009

Я получаю исключение из процесса .net, который использует вызов взаимодействия для API-функции win32. У меня есть отладчик, и я хочу увидеть значение LastError. Можно ли увидеть значение LastError из отладчика Visual Studio?

Два примечания: процесс, который выдает исключение, не мой, и я не могу изменить его исходный код, чтобы получить значение LastError.
Я использую бета-версию Visual Studio 2010 Я предполагаю, что решение, которое будет работать для VS 2008, будет работать с 2010 года.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 22 мая 2009

Вы можете вызвать Marshal.GetLastWin32Error () , чтобы получить последнее сообщение об ошибке Windows API. Это предложенный метод (в отличие от использования P / Invoke).

Из документов: «GetLastWin32Error предоставляет метод Win32 GetLastError API из Kernel32.DLL. Этот метод существует, поскольку небезопасно делать прямой вызов платформы для GetLastError для получения этой информации. Если вы хотите получить доступ к этому коду ошибки , вы должны вызвать GetLastWin32Error, а не писать собственное определение вызова платформы для GetLastError и вызывать его. В среде общего языка можно выполнять внутренние вызовы API, которые перезаписывают поддерживаемую операционную систему GetLastError. "

Кроме того, с точки зрения неизменения источника:

Это будет работать в непосредственном окне Visual Studio, при условии, что вызов P / Invoke был украшен DllImportAttribute.SetLastError . Однако если в вызове P / Invoke для API Windows отсутствовал этот атрибут, вам немного не повезло, поскольку вполне возможно, что маршаллирующий API перезапишет значение в GetLastError, прежде чем вы сможете его увидеть.

3 голосов
/ 22 мая 2009

Попробуйте посмотреть "$ err" (см. этот вопрос ). Также рассмотрите вопрос , в котором обсуждается добавление SetLastError к вашему вызову P / Invoke.

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