System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'

System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'

我们正在调用一个在 WindowsIdentity 上调用 GetCurrent 的 dotnet 标准 dll。它在 dotnet 核心应用程序中运行良好,但一旦将其导入 dotnet 框架 (4.7.2) 应用程序就会出现此错误:

System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'

尽管几个月前在 dotnet/standard github 问题论坛上提出了这个问题,但这个问题仍然存在: https://github.com/dotnet/standard/issues/1279

听起来 就像在构建时间与 运行 时间(通过 "bait and switch" 方法工作)之间的程序集解析工作方式的问题.当你遇到这种传递依赖的问题时,首先要尝试的是让你的库加入诱饵和转换派对,通过声明它可能对不同的 TFM 有不同的需求。幸运的是,这很容易;它通常只是意味着改变:

<TargetFramework>netstandard2.0</TargetFramework>

<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>

现在这是一个多目标包。当构建 应用程序 (exe 等)(不是库 - 仅应用程序)时,它会检查整个依赖关系树并找出最合适的 dll 版本 每个包裹分开。这意味着如果应用程序以 net472net48 等为目标 - 他们将获得您的 net472 构建,它本身可能具有细微不同的前进链(即使您看不到他们)。如果应用程序以 .NET Core 为目标,他们将获得包的 netstandard2.0 版本,以及 具有的任何依赖项。

注意:为了获得最佳覆盖率,您可能想要将 TFM 稍微降低到:

<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>

原因是 net461net462 声称 能够处理 netstandard2.0 - 所以如果一个应用程序是目标 net461 和你的包目标 netstandard2.0;net472,然后 "best" 匹配是 netstandard2.0,这大概仍然不起作用。当然,您可以根据需要拥有任意数量(甚至更改每个的后续参考)- 也许:

<TargetFrameworks>netstandard2.0;netcoreapp3.0;net461;net472</TargetFrameworks>

通常您只将 TFM 添加到:

  • 利用特定 TFM 上可用的额外功能,或
  • 覆盖当前列表未涵盖的平台,或者
  • 修复bait-and-switch/dependency个问题