我们正在调用一个 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
这听起来像是构建时与运行时之间的程序集解析工作方式的问题(通过“诱饵和切换”方法工作)。当您遇到此类传递依赖问题时,首先要尝试的是让您的库加入诱饵并切换方,通过声明它可能对不同的 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 添加到以下任一位置:
将具有 Docker 支持的项目从 .net8 更新为 .net9 后,我遇到了同样的错误。我忘记更新我的
Dockerfile
以指向较新的图像,修复(重新生成)docker 文件后,错误消息消失了。