.NET Standard是否在支持的所有平台上规范化HResult值?

8

我正在创建一个简单的函数,用于创建随机文件。为了线程安全,它会在重试循环中创建文件,如果文件已存在,则会再次尝试。

while (true)
{
    fileName = NewTempFileName(prefix, suffix, directory);

    if (File.Exists(fileName))
    {
        continue;
    }

    try
    {
        // Create the file, and close it immediately
        using (var stream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.Read))
        {
            break;
        }
    }
    catch (IOException e)
    {
        // If the error was because the file exists, try again
        if ((e.HResult & 0xFFFF) == 0x00000050)
        {
            continue;
        }

        // else rethrow it
        throw;
    }
}

根据MSDN文档,HResult值来自于COM,这表明它只适用于Windows系统,而且它专门列出了“Win32 codes”。但是由于该库面向.NET Standard,最理想的情况是它可以在所有.NET Standard支持的平台上运行
我想知道的是,我是否可以依赖上述使用HResult值的方法实现跨平台?文档对此并不清楚。
如果不能,那么我应该如何确定在其他平台上能够预期哪些HResult值?

注意:虽然有类似的问题“.NET定义了常见的HRESULT值吗?”,但它是在.NET Standard(以及.NET的跨平台支持)存在之前提出的,因此我无法依靠该答案来回答这个问题。

目前,我们的代码库只使用以下值:
  1. 0x00000020 - ERROR_SHARING_VIOLATION
  2. 0x00000021 - ERROR_LOCK_VIOLATION
  3. 0x00000050 - ERROR_FILE_EXISTS
我们的目标是.NET Standard 1.5。

注意:虽然接受的答案确实满足了我在这里提出的问题,但我有一个后续问题“如何使捕获通用IOException在不同平台上都可靠?”


我猜你需要更具体地说明场景或特定的错误代码,以便进行依赖。有许多地方使用预定义代码列表(您可以在CoreCLR和fullfx参考源代码中搜索“hresults.cs”),对于某些情况,还有规范化函数(例如文件错误的此函数)。 - Martin Ullrich
谢谢Martin。我添加了我目前感兴趣的3个错误。虽然我有点希望得到一个更一般性的答案。但通常,我们只对文件IO错误感兴趣。 - NightOwl888
你可能想要链接到这份文档而不是MSDN上的文档,因为它是官方的.NET标准1.5 API文档。(我相当确定它是MSDN的复制粘贴,但指向正确的位置是很好的。) - Scott Chamberlain
我已经更新了链接。我还提出了一个后续问题 https://stackoverflow.com/questions/46382637 - NightOwl888
@MartinUllrich - 请问您能具体回答一下 ERROR_SHARING_VIOLATIONERROR_LOCK_VIOLATION 是否跨平台吗?我尝试分析了您提供的代码,但似乎找不到定义这些常量的实际位置。我们有一个效率较低的后备实现,但我宁愿不使用它或者仅在不太流行的平台上使用它。 - NightOwl888
@NightOwl888,我相信回答的Jan Kotas更有资格正确回答这个问题。我只会像你现在做的一样浏览相同的代码。 - Martin Ullrich
1个回答

7

谢谢。不幸的是,您提供的链接仅显示代码,而没有提供值的资源文件。在该目录中似乎没有其他平台的相应文件。我是否可以得出结论,以上方法无法可靠地实现?还是有一种方法可以获取我需要的所有平台的所有值?请注意,我只需要我的问题中每个平台.NET Standard 1.5支持的3个错误。 - NightOwl888
这种方法无法可靠地实现可移植性。在这种情况下,HResult是底层操作系统返回的结果。它可能在Linux、macOS、FreeBSD等系统之间有所不同。我将编辑帖子以使其更清晰明了。 - Jan Kotas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接