System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'
System.PlatformNotSupportedException: 'Windows Principal functionality is not supported on this platform.'
我们正在调用一个在 WindowsIdentity 上调用 GetCurrent 的 dotnet 标准 dll。它在 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
这 听起来 就像在构建时间与 运行 时间(通过 "bait and switch" 方法工作)之间的程序集解析工作方式的问题.当你遇到这种传递依赖的问题时,首先要尝试的是让你的库加入诱饵和转换派对,通过声明它可能对不同的 TFM 有不同的需求。幸运的是,这很容易;它通常只是意味着改变:
<TargetFramework>netstandard2.0</TargetFramework>
到
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
现在这是一个多目标包。当构建 应用程序 (exe 等)(不是库 - 仅应用程序)时,它会检查整个依赖关系树并找出最合适的 dll 版本 每个包裹分开。这意味着如果应用程序以 net472
、net48
等为目标 - 他们将获得您的 net472
构建,它本身可能具有细微不同的前进链(即使您看不到他们)。如果应用程序以 .NET Core 为目标,他们将获得包的 netstandard2.0
版本,以及 具有的任何依赖项。
注意:为了获得最佳覆盖率,您可能想要将 TFM 稍微降低到:
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
原因是 net461
、net462
等 声称 能够处理 netstandard2.0
- 所以如果一个应用程序是目标 net461
和你的包目标 netstandard2.0;net472
,然后 "best" 匹配是 netstandard2.0
,这大概仍然不起作用。当然,您可以根据需要拥有任意数量(甚至更改每个的后续参考)- 也许:
<TargetFrameworks>netstandard2.0;netcoreapp3.0;net461;net472</TargetFrameworks>
通常您只将 TFM 添加到:
- 利用特定 TFM 上可用的额外功能,或
- 覆盖当前列表未涵盖的平台,或者
- 修复bait-and-switch/dependency个问题
我们正在调用一个在 WindowsIdentity 上调用 GetCurrent 的 dotnet 标准 dll。它在 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
这 听起来 就像在构建时间与 运行 时间(通过 "bait and switch" 方法工作)之间的程序集解析工作方式的问题.当你遇到这种传递依赖的问题时,首先要尝试的是让你的库加入诱饵和转换派对,通过声明它可能对不同的 TFM 有不同的需求。幸运的是,这很容易;它通常只是意味着改变:
<TargetFramework>netstandard2.0</TargetFramework>
到
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
现在这是一个多目标包。当构建 应用程序 (exe 等)(不是库 - 仅应用程序)时,它会检查整个依赖关系树并找出最合适的 dll 版本 每个包裹分开。这意味着如果应用程序以 net472
、net48
等为目标 - 他们将获得您的 net472
构建,它本身可能具有细微不同的前进链(即使您看不到他们)。如果应用程序以 .NET Core 为目标,他们将获得包的 netstandard2.0
版本,以及 具有的任何依赖项。
注意:为了获得最佳覆盖率,您可能想要将 TFM 稍微降低到:
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
原因是 net461
、net462
等 声称 能够处理 netstandard2.0
- 所以如果一个应用程序是目标 net461
和你的包目标 netstandard2.0;net472
,然后 "best" 匹配是 netstandard2.0
,这大概仍然不起作用。当然,您可以根据需要拥有任意数量(甚至更改每个的后续参考)- 也许:
<TargetFrameworks>netstandard2.0;netcoreapp3.0;net461;net472</TargetFrameworks>
通常您只将 TFM 添加到:
- 利用特定 TFM 上可用的额外功能,或
- 覆盖当前列表未涵盖的平台,或者
- 修复bait-and-switch/dependency个问题