[英]NuGet Package with multiple target dependencies
一些 NuGet 包有一些目标依赖关系。 例如,package Microsoft.Extensions.Logging.Console 版本 3.1.3:
https://www.nuget.org/packages/Microsoft.Extensions.Logging.Console/3.1.3
.NETCoreApp 3.1
Microsoft.Extensions.Configuration.Abstractions (>= 3.1.3)
Microsoft.Extensions.Logging (>= 3.1.3)
Microsoft.Extensions.Logging.Configuration (>= 3.1.3)
.NETStandard 2.0
Microsoft.Extensions.Configuration.Abstractions (>= 3.1.3)
Microsoft.Extensions.Logging (>= 3.1.3)
Microsoft.Extensions.Logging.Configuration (>= 3.1.3)
.NET 3.1 与 .NET 标准 2.0 兼容,
.NET Core 2.* 与 .NET 标准 2.0 兼容。
编辑:
Microsoft 已发布文档对此进行了总结:
package Microsoft.Extensions.Logging.Console 并不明显。 再来看看Microsoft.Extensions.Identity.Core: https://www.nuget.org/packages/Microsoft.Extensions.Identity.Core/3.1.5
请参阅csproj :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>ASP.NET Core Identity is the membership system for building ASP.NET Core...</Description>
<TargetFrameworks>netstandard2.0;$(DefaultNetCoreTargetFramework)</TargetFrameworks>
...
</PropertyGroup>
...
</Project>
This package target .NET Standard 2.0 and .NET Core 3.1 (value of the Azure DevOps variable $(DefaultNetCoreTargetFramework)). release 中的编译结果为:
生成了两个不同的 dll,但有什么区别?
请参阅文件PasswordHasher.cs :
public class PasswordHasher<TUser> : IPasswordHasher<TUser> where TUser : class
{
...
#if NETSTANDARD2_0
// Compares two byte arrays for equality. The method is specifically written so that the loop is not optimized.
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static bool ByteArraysEqual(byte[] a, byte[] b)
{
if (a == null && b == null)
{
return true;
}
if (a == null || b == null || a.Length != b.Length)
{
return false;
}
var areSame = true;
for (var i = 0; i < a.Length; i++)
{
areSame &= (a[i] == b[i]);
}
return areSame;
}
#endif
private static bool VerifyHashedPasswordV3(byte[] hashedPassword, string password, out int iterCount)
{
...
// Hash the incoming password and verify it
byte[] actualSubkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, subkeyLength);
#if NETSTANDARD2_0
return ByteArraysEqual(actualSubkey, expectedSubkey);
#elif NETCOREAPP
return CryptographicOperations.FixedTimeEquals(actualSubkey, expectedSubkey);
#else
#error Update target frameworks
#endif
}
}
对于 .NET Core 3.1,使用CryptographicOperations.FixedTimeEquals方法。 但是这种方法在 .NET Standard 2.0 中不存在。 然后在 Microsoft.Extensions.Identity.Core.dll 中添加了一个未优化的方法 ByteArraysEqual 来代替缺席的方法。
当您使用 package NuGet Microsoft.Extensions.identity.Core 检查 hash 密码时: .NET Core 3.1 项目,您使用平台特定方法 CryptographicOperations.FixedTimeEquals。 . .NET 标准 2.0 兼容项目,您使用未优化的方法 ByteArraysEqual。
问题是:
为什么要指定 .NET Core 3.1 目标依赖项?
.NET 标准 2.0 生成的 dll 与 .NET Core 3.1 兼容并且可能就足够了,但针对特定平台,这允许使用更优化的特定平台组件。
我可以在 .NET Core 2.* 应用程序中使用这个 package 吗? 与 .NET 4.7 和 .NET 4.8 相同的问题?
是的,您可以在 .NET Core 2.* 中使用此 package,因为它与 .NET 标准 2.0 兼容,但您没有更优化的版本。 对 .NET 框架 4.7 和 .NET 框架 4.8 的相同答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.