Почему в командной строке C# Interactive (csi.exe) игнорируется явная ссылка на сборку?

Microsoft (R) Visual C# Interactive Compiler version 2.9.0.63208

Windows 7 64 bit

NBitcoin 4.1.1.68

====

System.Security.Cryptography.Algorithms версия 4.3.0.0 имеет SHA256Managed класс, который я хочу использовать в C# Interactive (csi.exe).

Я добавил эту сборку в GAC с gacutil -i [path_to_dll] команда. Я запустил csi с /r:[path_to_dll_dir]/System.Security.Cryptography.Algorithms.dll опция командной строки.

Кроме того, после csi начал, я также сделал #r "[path_to_dll]" ссылка. Пояс и подтяжки типа мелочи. Я знаю. Но я полагаю, я надеялся, что излишнее побуждение заставит его поступить правильно.

Мое приложение использует класс из сторонней библиотеки. Следующий код был в значительной степени дословно скопирован из стороннего метода, который вызывает мое приложение. Если я запускаю следующий код в csi работает нормально...

using System;
using System.Security.Cryptography;

byte[] b = Guid.NewGuid().ToByteArray();

var sha = new SHA256Managed(); 

byte[] c = sha.ComputeHash(b, 0, 15);

Теперь вот в чем дело. Этот сторонний класс определяет метод, который вызывает SHA256Managed.ComputeHash(byte[], int, int) точно так же, как код выше.

Для обсуждения давайте обратимся к стороннему классу и методу как Foo.m(),

Проблема в том, когда я звоню третьей стороне Foo.m() от csi, csi воздерживается от...

Could not load type 'System.Security.Cryptography.SHA256Managed' from assembly 'System.Security.Cryptography.Algorithms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
  + Third.Party.Foo.m(byte[], int, int)

Помните, я явно добавил сборку криптоалгоритма версии 4.3.0.0 в GAC. Плюс я явно ссылался на DLL с обоими #r а также /r:, Так что же дает?

Я могу видеть в FusLogVw обязательные журналы, которые csi загружает сборку версии 4.0.0.0; несмотря на то, что я явно настаиваю на использовании версии 4.3.0.0. System.Security.Cryptography.Algorithms версия 4.0.0.0 не имеет SHA256Managed учебный класс.

Пожалуйста, помогите мне разобраться, как сделать csi использовать сборку, которую я говорю, чтобы использовать? Имейте в виду, что он использует правильную версию для кода, написанного непосредственно в csi, Так почему же он не использует правильную версию сборки для точно такого же кода в сторонней библиотеке?

1 ответ

TL; DR: csi Я новичок, установив сторонний lib впервые два дня назад, и скопировал его dll и все его зависимости в подкаталог csi каталог bin, чтобы получить csi найти и загрузить его.


Длинный ответ: после того, как я поделился некоторыми идеями от знающего и полезного эксперта по C# @PetSerAl, я в конце концов понял, каким был ответ на мой первоначальный вопрос.

FusLogVw Запись журнала привязки сборки, с которой я столкнулся очень скоро после установки сторонней библиотеки, привел к тому, что я поместил сторонний dll в подкаталог csi Бин Дир. Это, кажется, непреднамеренно сорвал csi Механизм поиска сборки делает полный анализ всех мест, где он должен был искать сборки. В следствии, csi находил и ссылался на свою предустановленную старую версию System.Security.Cryptography.Algorithms который распространяется с csi как часть оригинальной установки VS 2017.

Следовательно, это сделало csi игнорировать оба последующих /r: а также #r ссылки на Algorithm Длл, что я проходил мимо. Так что он не нашел несуществующего SHA256Managed введите собственную, более старую версию 4.0.0.0 сборки, которая была в каталоге bin. Вот что вызвало ошибку сборки подшивки, о которой сообщалось в оригинальном посте.

Удаление сторонней сборки и со csi Бин Субдир сделал свое дело. Оттуда, получая csi для корректной работы со сторонней библиотекой нужно было только запустить csi с правильными ссылками сборки...

C:\>csi /u:NBitcoin /u:NBitcoin.Crypto /u:System.Security.Cryptography /lib:[my_vs_2017_project_dir]\bin\Release\net461;[my_vs_2017_home_dir]\2017\Community\MSBuild\15.0\bin\Roslyn\ /r:System.Data.dll /r:System.Drawing.dll /r:System.IO.Compression.FileSystem.dll /r:System.Numerics.dll /r:System.Runtime.Serialization.dll /r:System.Xml.dll /r:System.Xml.Linq.dll /r:Microsoft.Extensions.Logging.Abstractions.dll /r:[my_vs_2017_project_dir]\bin\Release\net461\Microsoft.Extensions.Logging.Abstractions.dll /r:[my_vs_2017_project_dir]\bin\Release\net461\Newtonsoft.Json.dll /r:[my_vs_2017_project_dir]\bin\Release\net461\System.Buffers.dll /r:[my_nuget_repo_pkgs_dir]\system.net.http\4.3.4\lib\net46\System.Net.Http.dll /r:[my_vs_2017_project_dir]\bin\Release\net461\System.Net.Requests.dll /r:[my_nuget_repo_pkgs_dir]\nbitcoin\4.1.1.68\lib\net461\NBitcoin.dll /r:[my_nuget_repo_pkgs_dir]\system.security.cryptography.algorithms\4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll /r:[my_nuget_repo_pkgs_dir]\system.security.cryptography.csp\4.3.0\lib\net46\System.Security.Cryptography.Csp.dll /r:[my_nuget_repo_pkgs_dir]\system.security.cryptography.encoding\4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll /r:[my_nuget_repo_pkgs_dir]\system.security.cryptography.primitives\4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll /r:[my_nuget_repo_pkgs_dir]\system.security.cryptography.x509certificates\4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll 
Microsoft (R) Visual C# Interactive Compiler version 2.9.0.63208
Copyright (C) Microsoft Corporation. All rights reserved.

Type "#help" for more information.
>
> Console.WriteLine("Hello World! " + new Key().GetWif(Network.Main));
Hello World! L2emt8acTdsGMXzJfAMSARUvKvP8xUCULcQbpiY76EpeyvKyrir2
>

Я уверен, что есть менее подробный способ пройти все эти /r: а также /u: варианты на csi запускать. Но главное - заставить его найти и загрузить правильные сборки.

Другие вопросы по тегам