无法加载文件或程序集'System.Security.Cryptography.Algorithms,Version = 4.1.0.0

时间:2017-09-05 09:43:08

标签: c# .net .net-standard .net-standard-1.4

我正在尝试在.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库安装:

  • System.Security.Cryptography.Algorithms v = 4.3.0
  • System.Security.Cryptography.Primitives v = 4.3.0

但是尝试解雇它会让我:

'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

4 个答案:

答案 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

  • System.Security.Cryptography.Primitives v = 4.3.0
  • 根据getTimestamp主题,它应该适用于.NET标准 1.3 和:

  • System.Security.Cryptography.Algorithms v = 4.2.0

  • System.Security.Cryptography.Primitives v = 4.0.0

对于this提出的.Net Standard 1.4解决方案是不错的选择。

答案 3 :(得分:0)

就我而言,我也将NuGet包也添加到了主要的Net应用程序中(尽管我在单独的NetStandard 2.0类lib中使用了加密功能,而在主要应用程序代码库中使用了不是),解决了这个问题。

此外,我的主要Net应用程序是Net.Framework 4.6.1