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
这听起来像是构建时与运行时之间的程序集解析工作方式的问题(通过“诱饵和切换”方法工作)。当您遇到此类传递依赖问题时,首先要尝试的是让您的库加入诱饵和切换方,声明它可能对不同的 TFM 有不同的需求。幸运的是,这很容易;它通常只意味着改变:
<TargetFramework>netstandard2.0</TargetFramework>
Run Code Online (Sandbox Code Playgroud)
到
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
现在这是一个多目标包。当构建应用程序(exe 等)(不是仅库应用程序)时,它会检查整个依赖关系树并分别找出最适合每个包的dll 版本。这意味着,如果应用程序的目标是net472、net48等 - 他们将获得您的net472构建,该构建本身可能具有细微不同的前向链(即使您看不到它们)。如果应用程序面向 .NET Core,它们将获取netstandard2.0包的版本以及所具有的任何依赖项。
注意:为了获得最佳覆盖范围,您可能需要稍微降低 TFM 以:
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
这样做的原因是net461,net462等声称能够处理netstandard2.0- 因此,如果应用程序的目标是net461并且您的程序包的目标netstandard2.0;net472是,那么“最佳”匹配是netstandard2.0,这可能仍然不起作用。当然,您可以根据需要拥有任意多个(甚至可以更改每个的后续参考) - 也许:
<TargetFrameworks>netstandard2.0;netcoreapp3.0;net461;net472</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
通常您只需将 TFM 添加到以下任一位置:
| 归档时间: |
|
| 查看次数: |
6126 次 |
| 最近记录: |