web-dev-qa-db-ja.com

ファイルまたはアセンブリ 'System.Security.Cryptography.Algorithms、バージョン= 4.1.0.0を読み込めませんでした

私の.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ページ には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);
    }
}

したがって、(NuGetには存在しない)4.1.0バージョンが必要ですが、パスは4.3.0に設定されています

7
Carlos28

.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標準1.4ライブラリに加えて、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に切り替えた場合、これは問題が少ないようです。

8

このライブラリを「クラシック」プロジェクトで使用する場合は、使用中のプロジェクト/ライブラリ(ユニットテストプロジェクトはここではライブラリとしてカウントされます)で自動バインディングリダイレクト生成をアクティブにする必要がある場合があります。これは、これらのプロパティを消費(!)プロジェクトのcsprojファイルに追加することで実行できます。

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

詳細とオプションについては、関連する 「。NET Framework 2.0の.NET FrameworkとNuGetの問題」発表記事 を参照してください。

4
Martin Ullrich

私が見つけた解決策:

  • ライブラリを。NET Standard 1.4から2.0に更新すると、次のように機能します。

  • System.Security.Cryptography.Algorithmsv = 4.3.0

  • System.Security.Cryptography.Primitivesv = 4.3.0

  • this トピックによれば、.NET Standard1.3で動作し、次のようになります。

  • System.Security.Cryptography.Algorithmsv = 4.2.0

  • System.Security.Cryptography.Primitivesv = 4.0.0

Martin Liversage が提案する.Net Standard 1.4ソリューションの場合は、適切なオプションです。

0
Carlos28