我正在尝试在.NET Standard 1.4库中使用System.Security.Cryptography.RNGCryptoServiceProvider类,根据this主题,我的代码如下所示:
private byte[] GenerateRandomNumber(int length)
{
using (var randomNumberGenerator = RandomNumberGenerator.Create())
{
var number = new byte[length];
randomNumberGenerator.GetBytes(number);
return number;
}
}
我也从NuGet库安装:
但是尝试解雇它会让我:
'Could not load file or package' System.Security.Cryptography.Algorithms, Version = 4.1.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'or one of its dependencies. The specified file could not be found. '
在NuGet page上没有4.1.0.0版本,只有4.1.0-rc2-24027,安装此版本后,我得到了完全相同的异常。
有什么问题?
修改: 从.NET Standard 1.4切换到1.6无济于事
EDIT2 :
当我在RandomNumberGenerator
点击F12时:
#region Assembly System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Users\x.y\.nuget\packages\system.security.cryptography.algorithms\4.3.0\ref\netstandard1.4\System.Security.Cryptography.Algorithms.dll
#endregion
namespace System.Security.Cryptography
{
public abstract class RandomNumberGenerator : IDisposable
{
protected RandomNumberGenerator();
public static RandomNumberGenerator Create();
public void Dispose();
public abstract void GetBytes(byte[] data);
protected virtual void Dispose(bool disposing);
}
}
所以它想要4.1.0版本(NuGet上不存在)但路径设置为4.3.0
答案 0 :(得分:7)
除了拥有.NET标准库之外,您还有一个应用程序(如控制台应用程序)或测试项目。应用程序的平台确定要加载的.NET标准库引用的特定程序集。
因此,您的库引用了System.Security.Cryptography.Algorithms
4.3.0但是要为您的平台加载的程序集的实际版本可能是4.1.0(这是您在.NET Framework 4.6.1上获得的版本)。
因此,您需要通知应用程序将所需版本(4.3.0)重定向到运行时的实际版本(4.1.0)。您可以在app.config
文件中执行此操作。请记住,该文件由应用程序使用,而不是库。将app.config
文件添加到您的库中无济于事。
我尝试创建一个类似你所描述的项目,除了引用System.Security.Cryptography.Algorithms
的.NET Standard 1.4库之外,4.3.0还有一个.NET Framework 4.62控制台应用程序,我必须包含一个{{ 1}}文件包含以下内容:
app.config
有趣的是,如果你切换到.NET Standard 2.0,这似乎不是一个问题。
答案 1 :(得分:3)
如果要在“经典”项目中使用此库,则可能需要在使用项目/库中激活自动绑定重定向生成(单元测试项目在此处计为库)。这可以通过将这些属性添加到使用(!)项目的csproj文件来完成:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
有关更多详细信息和选项,请参阅相关的"Issues with .NET Standard 2.0 with .NET Framework & NuGet" announcement post。
答案 2 :(得分:0)
我找到的解决方案:
将库从 .NET Standard 1.4升级到2.0 然后适用于:
System.Security.Cryptography.Algorithms v = 4.3.0
根据getTimestamp主题,它应该适用于.NET标准 1.3 和:
System.Security.Cryptography.Algorithms v = 4.2.0
对于this提出的.Net Standard 1.4解决方案是不错的选择。
答案 3 :(得分:0)
就我而言,我也将NuGet包也添加到了主要的Net应用程序中(尽管我在单独的NetStandard 2.0类lib中使用了加密功能,而在主要应用程序代码库中使用了不是),解决了这个问题。
此外,我的主要Net应用程序是Net.Framework 4.6.1