Не удалось загрузить файл или сборку «System.Security.Cryptography.Algorithms, версия = 4.1.0.0».

Я пытаюсь использовать класс System.Security.Cryptography.RNGCryptoServiceProvider в моей библиотеке .NET Standard 1.4 и в соответствии с в этой теме мой код выглядит так:

    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
  • Система.Безопасность.Криптография.Примитивы 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:

Когда я нажимаю F12 на RandomNumberGenerator:

#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.


person Carlos28    schedule 05.09.2017    source источник
comment
В нем говорится, что у него есть следующие зависимости для .NET Standard 1.4. Вы также добавили эти ссылки? System.IO (>= 4.3.0), System.Runtime (>= 4.3.0), System.Security.Cryptography.Primitives (>= 4.3.0)   -  person Equalsk    schedule 05.09.2017
comment
Да, у меня есть System.IO 4.3.0, System.Runtime 4.3.0 и System.Security.Cryptography.Primitives 4.3.0.   -  person Carlos28    schedule 05.09.2017
comment
Я предлагаю вам использовать Fusion Log Viewer, чтобы получить сведения об ошибке загрузки. Скорее всего версия сборки в вашей папке bin не совпадает с запрошенной версией, хотя она и совместима. Затем вам нужно добавить перенаправление привязки в вашем app.config перенаправлении желаемой версии на актуальную версию.   -  person Martin Liversage    schedule 05.09.2017
comment
Fusion Log Viewer не показывает никаких данных об этом (может быть, это потому, что программа выдает исключение System.IO.FileNotFoundException?), и если он идет на перенаправление привязки, я в настоящее время запускаю этот код из модульного теста, поэтому я считаю, что он там не будет работать.   -  person Carlos28    schedule 05.09.2017
comment
@Carlos28: Я могу подтвердить, что Fusion Log Viewer не всегда сообщает о привязках сборок при использовании .NET Core/Standard. Я не знаю, является ли это ошибкой или функцией, ожидающей реализации. Тем не менее, журнал Fusion действительно полезен, поэтому я надеюсь, что мы сможем продолжать использовать его в будущем.   -  person Martin Liversage    schedule 05.09.2017
comment
Из какого проекта вы запускаете эту библиотеку? Консольное приложение .NET Core, классическое веб-приложение ASP.NET, классический тестовый проект, тестовый проект .NET Core, …?   -  person Martin Ullrich    schedule 05.09.2017


Ответы (4)


В дополнение к библиотеке .NET Standard у вас также есть приложение (например, консольное приложение) или, возможно, тестовый проект. Платформа для приложения определяет, какую конкретную сборку, на которую ссылается ваша библиотека .NET Standard, нужно загрузить.

Таким образом, ваша библиотека ссылается на 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 в вашу библиотеку ничего не изменит.

Я попытался создать небольшой проект, подобный описанному вами, в котором в дополнение к библиотеке .NET Standard 1.4, которая ссылается на System.Security.Cryptography.Algorithms 4.3.0, есть консольное приложение 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.

person Martin Liversage    schedule 05.09.2017
comment
@Carlos28: Чтобы решить вашу проблему, вам нужно убедиться, что System.Security.Cryptography.Algorithms.dll находится в вашей папке bin. Если версия сборки не совпадает с 4.3.0, вам необходимо создать перенаправление привязки, чтобы перенаправить 4.3.0 на версию в вашей папке bin. Возможно, вам придется использовать перенаправления, которые отличаются от тех, которые я предоставил в своем ответе. Это зависит от платформы вашего приложения. - person Martin Liversage; 05.09.2017

Если эта библиотека будет использоваться в «классических» проектах, вам может потребоваться активировать автоматическое создание перенаправления привязки в потребляющих проектах/библиотеках (проекты модульного тестирования здесь считаются библиотекой). Это можно сделать, добавив их в свойства файла csproj потребляющего(!) проекта:

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

См. соответствующий публикацию "Проблемы с .NET Standard 2.0 с .NET Framework и NuGet". для получения более подробной информации и вариантов.

person Martin Ullrich    schedule 05.09.2017
comment
Это сработало для меня (Net 4.8 ссылается на Net Std 2.0). Я также добавил ‹RestoreProjectStyle›PackageReference‹/RestoreProjectStyle› в ту же группу свойств. - person Anton Krouglov; 23.06.2020

Решения, которые я нашел:

  • Обновите библиотеку с .NET Standard 1.4 до 2.0, после чего она будет работать с:

  • Система.Безопасность.Криптография.Алгоритмы v=4.3.0

  • System.Security.Cryptography.Primitives v=4.3.0

  • Согласно этой теме, он должен работать на .NET Standard 1.3 и:

  • Система.Безопасность.Криптография.Алгоритмы v=4.2.0

  • System.Security.Cryptography.Primitives v=4.0.0

Для .Net Standard 1.4 решение, предложенное Martin Liversage, является хорошим вариантом.

person Carlos28    schedule 05.09.2017

В моем случае я просто добавил пакет NuGet в основное сетевое приложение (несмотря на то, что я использую криптографию в отдельной библиотеке класса NetStandard 2.0, не в основной кодовой базе приложения), и это решило проблему. .

Кроме того, мое основное сетевое приложение — Net.Framework 4.6.1.

person Yury Schkatula    schedule 01.10.2020