如何在 C# 中清除 errno?

How do I clear errno in C#?

如何清除 .NET 核心中的 errno

我可以通过 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();
}

如果代码在哪里????将被省略,这会产生虚假错误。

我想如果我完全卡住了,我可以做一些愚蠢的事情,比如做一些失败并带有明确错误代码的事情,然后检查那个,但是我们可以完全排除一个特定错误的情况并不多这很容易生成。

所以答案是????仅在 .NET Core 上真的什么都不是。它在 .NET Framework 和 Mono 上的行为不同。

Rufo 提供了 https://github.com/dotnet/corefx/issues/17198

的非常好的 link

这是 .NET Core https://github.com/dotnet/coreclr/pull/614 上的一个故意差异,记录非常糟糕。