System.PlatformNotSupportedException:“此平台不支持 Windows 主要功能。”

问题描述 投票:0回答:2

我们正在调用一个 dotnet 标准 dll,它在 WindowsIdentity 上调用 GetCurrent。它在 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

.net .net-core .net-standard
2个回答
5
投票

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

<TargetFramework>netstandard2.0</TargetFramework>

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

现在这是一个多目标包。当构建应用程序(exe等)(不是库 - 仅应用程序)时,它会检查整个依赖关系树并找出分别对于每个包最合适的dll版本。这意味着,如果应用程序的目标是

net472
net48
等 - 他们将获得您的
net472
版本,该版本本身可能具有细微不同的前向链(即使您看不到它们)。如果应用程序面向 .NET Core,他们将获得包的
netstandard2.0
版本,以及 that 具有的任何依赖项。

注意:为了获得最佳覆盖范围,您可能想要稍微降低 TFM 以:

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

这样做的原因是

net461
net462
claim 能够处理
netstandard2.0
- 因此,如果应用程序针对
net461
并且您的包针对
netstandard2.0;net472
,那么“最佳”匹配是
netstandard2.0
,这可能仍然行不通。当然,您可以根据需要拥有任意多个(甚至可以更改每个的后续参考) - 也许:

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

通常您只需将 TFM 添加到以下任一位置:

  • 利用特定 TFM 上可用的额外功能,或者
  • 到达当前列表未涵盖的平台,或者
  • 修复诱饵和切换/依赖问题

0
投票

将具有 Docker 支持的项目从 .net8 更新为 .net9 后,我遇到了同样的错误。我忘记更新我的

Dockerfile
以指向较新的图像,修复(重新生成)docker 文件后,错误消息消失了。

© www.soinside.com 2019 - 2024. All rights reserved.