c# - 如何在 C# 中清除 errno?

标签 c# linux .net-core errno

如何清除 .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/

相关文章:

javascript - 如何在 Asp.net 的静态方法服务器端代码中执行 JavaScript 警报?

c# - 从 DLL/程序集获取实例?

c# - Expression.MethodCallExpression 将 MemberExpression 作为参数传递

linux - 我应该什么时候编写 Linux 内核模块?

linux - 使用 sed 命令打印重复行?

c# - .net 核心中的单元测试 Url.Link

c# - X509CertificateValidationMode 在 Linux 中不起作用?

c# - WPF 事件触发器更改其他 UI 元素

linux - 如何根据文件 2 中的某些数字范围使 awk 将文件 1 中的行与文件 2 中的行匹配

mysql - 尝试在与 Pomelo.EntityFrameworkCore.MySql 相关的 dotnet core 3.1 中添加迁移时出错