System.PlatformNotSupportedException:'该平台不支持Windows主体功能。

时间:2019-10-15 09:32:29

标签: .net .net-core .net-standard

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

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

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

1 个答案:

答案 0 :(得分:2)

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

<TargetFramework>netstandard2.0</TargetFramework>

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

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

注意:为了获得最佳覆盖范围,您可能希望将TFM放到以下位置:

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

这样做的原因是net461net462声明能够处理netstandard2.0-因此,如果应用程序的目标是{{1} },而您的软件包以net461为目标,则“最佳”匹配是netstandard2.0;net472,据推测该匹配仍然无效。当然,您可以根据需要设置任意数量(甚至更改每个对象的向前引用)-也许:

netstandard2.0

通常,您只需将TFM添加到以下任意一个:

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