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

Jam*_*urt 6 .net .net-core .net-standard

我们正在调用一个 dotnet 标准 dll,它在 WindowsIdentity 上调用 GetCurrent。它在 dotnet 核心应用程序中工作正常,但是一旦将其导入到 dotnet 框架 (4.7.2) 应用程序中,就会出现以下错误:

System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 5

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

<TargetFramework>netstandard2.0</TargetFramework>
Run Code Online (Sandbox Code Playgroud)

<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

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

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

<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

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

<TargetFrameworks>netstandard2.0;netcoreapp3.0;net461;net472</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

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

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