如何在C#中清除errno?

时间:2018-09-01 03:55:05

标签: c# linux .net-core errno

如何清除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();
}

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

我想,如果我完全被卡住了,我可以做一些愚蠢的事情,例如做一些失败并显示确定的错误代码并进行检查,但是在很多情况下我们无法完全排除一个特定的错误,这很容易生成。

1 个答案:

答案 0 :(得分:0)

答案是????实际上,仅.NET Core上一无所有。在.NET Framework和Mono上,它的行为有所不同。

Rufo提供了一个非常不错的https://github.com/dotnet/corefx/issues/17198链接

这是.NET Core https://github.com/dotnet/coreclr/pull/614上的故意差异,已被大量记录。