无法加载文件或程序集“System.Security.Cryptography.Algorithms,版本= 4.1.0.0

问题描述 投票:0回答:5

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

  • 系统.安全.加密.算法 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页面上没有4.1.0.0版本,只有4.1.0-rc2-24027,安装此版本后我得到完全相同的异常。

出了什么问题?

编辑: 从 .NET Standard 1.4 切换到 1.6 没有帮助

编辑2

当我按

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

c# .net .net-standard .net-standard-1.4
5个回答
17
投票

除了拥有 .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
4.3.0 的 .NET Standard 1.4 库之外,还有一个 NET Framework 4.62 控制台应用程序,我必须包含一个
app.config
文件,其中包含为此,请执行以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
  </startup>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.1.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

有趣的是,如果您切换到 .NET Standard 2.0,这似乎就不是什么问题了。


9
投票

如果要在“经典”项目中使用此库,您可能需要在使用的项目/库中激活自动绑定重定向生成(此处的单元测试项目算作库)。这可以通过将这些属性添加到消费(!)项目的 csproj 文件中来完成:

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

请参阅相关的“.NET Standard 2.0 与 .NET Framework 和 NuGet 的问题”公告帖子,了解更多详细信息和选项。


0
投票

我找到的解决方案:

  • 将库从 .NET Standard 1.4 更新到 2.0,然后它可以使用:

  • 系统.安全.加密.算法 v=4.3.0

  • 系统.安全.加密.基元v=4.3.0

  • 根据this主题,它应该适用于.NET Standard 1.3并且:

  • 系统.安全.加密.算法 v=4.2.0

  • 系统.安全.加密.基元 v=4.0.0

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


0
投票

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

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


0
投票

从 web.config 中删除 dependentAssembly 对我有用

© www.soinside.com 2019 - 2024. All rights reserved.