Вы можете вызвать 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, прежде чем вы сможете его увидеть.