【问题标题】:How do I clear errno in C#?如何在 C# 中清除 errno?
【发布时间】:2018-09-01 03:55:04
【问题描述】:

如何清除.NET Core 中的errno

我可以通过Marshal.GetLastWin32Error() 轻松阅读它,但没有明显的方法来设置或清除它。谷歌搜索非常无用。 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();
}

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

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

【问题讨论】:

  • GetLastWin32Error 返回由 最后一个非托管函数返回的错误代码,该函数是使用设置了 SetLastError 标志的平台调用调用的。 - 设置 DllImportAttribute 并将 SetLastError 标志设置为 true,它将完成
  • 这是一个在 linux 平台上的用法示例github.com/dotnet/corefx/issues/17198 - 你看到 DllImport 属性了吗?这就是您清除最后一个错误号的方式。如果有错误,那么你应该报告它
  • @SirRufo:哎哟! framework/mono 和 core 的区别!

标签: c# linux .net-core errno


【解决方案1】:

所以答案原来是????真的只是在 .NET Core 上。它在 .NET Framework 和 Mono 上的行为不同。

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

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

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2011-12-15
    • 2012-04-22
    相关资源
    最近更新 更多