【问题标题】:System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'System.PlatformNotSupportedException:“此平台不支持 Windows 主体功能。”
【发布时间】:2019-10-15 09:32:29
【问题描述】:

我们正在调用一个 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

【问题讨论】:

  • 所以这特别是当您针对 netstandard,但running 在net472 上?图书馆目前有双重目标吗?还是它以网络标准为目标?如果是后者:你能使它成为双重目标吗?即<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>(它听起来像一个具有传递依赖的诱饵和切换失败)
  • 感谢@MarcGravell - 主机应用程序针对的是 net472,库仅针对 netstandard。按照您的建议将其设置为双重目标效果很好,非常感谢:-) 请随意将此作为正确答案,我会将其标记为正确。

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


【解决方案1】:

听起来就像是在构建时和运行时(通过“诱饵和切换”方法工作)之间的程序集解析工作方式的问题。当你遇到这种传递依赖的问题时,首先要尝试的是让你的库加入诱饵并切换派对,方法是声明它可能有不同的需求在不同的 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 为目标,那么“最佳”匹配是netstandard2.0,它可能仍然无法正常工作。当然,您可以根据需要拥有任意数量(甚至更改每个的后续引用)- 也许:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多