如何清除 .NET
Core 中的 errno
?
我可以通过 Marshal.GetLastWin32Error()
轻松读取它,但是没有明显的方法来设置或清除它。谷歌搜索非常无用。
Marshal.SetLastError()
不存在。
我似乎无法为 errno
写下 P/Invoke。它是一个线程静态 native 变量。
如果您想知道为什么有人要设置它,请参阅 man 3 readdir
。 API 特别要求在调用它之前将 errno
设置为 0
。
这就是 native 代码:
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();
}
如果代码在哪里????将被省略,这会产生虚假错误。
我想如果我完全卡住了,我可以做一些愚蠢的事情,比如做一些失败并带有明确错误代码的事情,然后检查那个错误代码,但是在很多情况下我们可以完全排除一个很容易的特定错误生成。
最佳答案
所以答案变成了????仅在 .NET Core 上真的什么都不是。它在 .NET Framework 和 Mono 上的行为不同。
Rufo 提供了一个很好的链接 https://github.com/dotnet/corefx/issues/17198
这是 .NET Core 上的故意差异 https://github.com/dotnet/coreclr/pull/614这是非常糟糕的记录。
关于c# - 如何在 C# 中清除 errno?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124722/