如何在 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 上的一个故意差异,记录非常糟糕。
如何清除 .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 上的一个故意差异,记录非常糟糕。