如何清除errno
核心中的.NET
?
我可以通过Marshal.GetLastWin32Error()
轻松地阅读它,但是没有明显的方法来设置或清除它。 Google搜索非常无用。
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();
}
如果代码在哪里?将被省略,这会得到虚假的错误。
我想,如果我完全被卡住了,我可以做一些愚蠢的事情,例如做一些失败并显示确定的错误代码并进行检查,但是在很多情况下我们无法完全排除一个特定的错误,这很容易生成。
答案 0 :(得分:0)
答案是????实际上,仅.NET Core上一无所有。在.NET Framework和Mono上,它的行为有所不同。
Rufo提供了一个非常不错的https://github.com/dotnet/corefx/issues/17198链接
这是.NET Core https://github.com/dotnet/coreclr/pull/614上的故意差异,已被大量记录。