【发布时间】:2018-09-01 03:55:04
【问题描述】:
如何清除.NET Core 中的errno?
我可以通过Marshal.GetLastWin32Error() 轻松阅读它,但没有明显的方法来设置或清除它。谷歌搜索非常无用。
Marshal.SetLastError() 不存在。
我似乎无法为errno 写下 P/Invoke。这是一个线程静态的原生变量。
如果您想知道为什么有人要设置它,请参阅man 3 readdir。 API 专门要求在调用之前将errno 设置为0。
这就是本机代码:
errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL && errno != 0) {
/* Handle error */
}
所以当写成.NET代码时:
????
IntPtr entry NativeMethods.readdir(dir);
if (entry == IntPtr.Zero && Marshal.GetLastWin32Error() != 0) {
throw new IOException();
}
如果代码在哪里???将被省略,这会产生虚假错误。
我想如果我完全卡住了,我可以做一些愚蠢的事情,比如做一些失败的事情,并检查一个明确的错误代码,但是我们可以完全排除一个很容易的特定错误的情况并不多生成。
【问题讨论】:
-
GetLastWin32Error 返回由 最后一个非托管函数返回的错误代码,该函数是使用设置了 SetLastError 标志的平台调用调用的。 - 设置 DllImportAttribute 并将 SetLastError 标志设置为 true,它将完成
-
这是一个在 linux 平台上的用法示例github.com/dotnet/corefx/issues/17198 - 你看到 DllImport 属性了吗?这就是您清除最后一个错误号的方式。如果有错误,那么你应该报告它
-
@SirRufo:哎哟! framework/mono 和 core 的区别!