Не могу использовать сборку в PowerShell после установки соответствующего пакета nuget

У меня проблема с библиотекой, установленной пакетом NuGet, которая не работает из PowerShell. Я установил его так (также пробовал CurrentUser область действия и более позднюю версию пакета, но в конце концов это не имеет значения):

Install-Package Microsoft.Bcl.AsyncInterfaces -Version 1.0.0.0

Microsoft.Bcl.AsyncInterfaces требуется модулем AWS.Tools, который я использую, но независимо от того, что я делаю, сборки модулей не могут его найти. Сначала я даже не мог добавить тип в свою собственную сессию:

Add-Type -AssemblyName Microsoft.Bcl.AsyncInterfaces

Тип добавления: не удается найти путь «/home/username/src/work-aws/generate-hostname/Microsoft.Bcl.AsyncInterfaces.dll», поскольку он не существует.

Но я смог загрузить его прямо из исходного каталога пакета:

Add-Type -Path "$(( Get-Package Microsoft.Bcl.AsyncInterfaces ).Source | Split-Path -Parent)/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll"

Однако... сборки в модуле AWS по-прежнему не видят его. Ошибки, которые я получаю от классов AWS, следующие:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку «Microsoft.Bcl.AsyncInterfaces, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51». Система не может найти указанный файл.

Что мне здесь не хватает? Я не уверен, как заставить этот модуль AWS увидеть сборку, и я не понимаю, почему после установки пакета PowerShell не разрешает сборку по имени, когда я вызываю Add-Type.

Изменить: я разместил вывод переменной Exception здесь, поскольку я пропустил пару уникальных битов ошибки, хотя все, что по-прежнему указано Microsoft.Bcl.AsyncInterfaces, не может быть найдено:

ErrorRecord                 : Exception calling "LoadTable" with "2" argument(s): "The type initializer for 'Amazon.DynamoDBv2.DynamoDBEntryConversion' threw an exception."
WasThrownFromThrowStatement : False
TargetSite                  : Void ConvertToMethodInvocationException(System.Exception, System.Type, System.String, Int32, System.Reflection.MemberInfo)
StackTrace                  :    at System.Management.Automation.ExceptionHandlingOps.ConvertToMethodInvocationException(Exception exception, Type typeToThrow, String 
                              methodName, Int32 numArgs, MemberInfo memberInfo)
                                 at CallSite.Target(Closure , CallSite , Type , Object , String )
                                 at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
                                 at System.Management.Automation.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
                                 at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
Message                     : Exception calling "LoadTable" with "2" argument(s): "The type initializer for 'Amazon.DynamoDBv2.DynamoDBEntryConversion' threw an exception."
Data                        : {System.Management.Automation.Interpreter.InterpretedFrameInfo}
InnerException              : System.TypeInitializationException: The type initializer for 'Amazon.DynamoDBv2.DynamoDBEntryConversion' threw an exception.
                               ---> System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types.
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                              Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The 
                              system cannot find the file specified.
                              
                                 at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                                 at System.Reflection.RuntimeAssembly.get_DefinedTypes()
                                 at Amazon.DynamoDBv2.DynamoDBEntryConversion.AddConverters(String suffix)
                                 at Amazon.DynamoDBv2.DynamoDBEntryConversion.SetV1Converters()
                                 at Amazon.DynamoDBv2.DynamoDBEntryConversion..ctor(ConversionSchema schema, Boolean isImmutable)
                                 at Amazon.DynamoDBv2.DynamoDBEntryConversion..cctor()
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                              System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, 
                              PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
                              
                              File name: 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
                              
                              
                                 --- End of inner exception stack trace ---
                                 at CallSite.Target(Closure , CallSite , Type , Object , String )
HelpLink                    : 
Source                      : System.Management.Automation
HResult                     : -2146233087

person Bender the Greatest    schedule 16.10.2020    source источник
comment
Спасибо за этот полезный ответ. Это объясняет, почему мне приходится загружать сборку самостоятельно, но не объясняет, почему после загрузки сборки командлеты из модуля PowerShell ее не видят.   -  person Bender the Greatest    schedule 19.10.2020
comment
Выпуск был вопросом порядка операций. Я опубликовал ответ на то, что решило это для меня.   -  person Bender the Greatest    schedule 20.10.2020
comment
Рад слышать, что вы докопались до сути. Я почистил свои комментарии и призываю вас сделать то же самое.   -  person mklement0    schedule 20.10.2020


Ответы (1)


Я обнаружил, что сборки, установленные с помощью Install-Package, должны быть загружены следующим образом:

Add-Type -Path "$(( Get-Package Microsoft.Bcl.AsyncInterfaces  ).Source | split-path -Parent)/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll"

это связано с тем, что каталоги package/lib в папках PackagementManagement провайдера не являются частью путей зондов .NET по умолчанию. Это не проблема, когда у вас есть модули или проекты, в которых пути сборки настраиваются в файле, но в сеансе PowerShell, насколько я знаю, вы не можете изменить путь зонда сборки. Таким образом, вы должны загрузить сборку с полным путем.


Что касается того, почему рассматриваемые сборки AWS не могли найти имя сборки после того, как я загрузил ее в свой сеанс, я также нашел решение. После некоторого дополнительного тестирования я обнаружил, что здесь есть порядок операций; если вы добавите сборку с Add-Type или [Reflection.Assembly]::LoadFile после того, как другая сборка попытается использовать ее, эта вторая сборка не сможет найти первую сборку на время сеанса PowerShell. В моем случае любая сборка, использующая Amazon.DynamoDBv2.DynamoDBEntryConversion каким-то образом, терпела неудачу, потому что никогда не могла найти Microsoft.Bcl.AsyncInterfaces.

Моя проблема заключалась в том, что я загружал новый сеанс и запускал свой код, забыв сначала использовать Add-Type для добавления сборки Microsoft.Bcl.AsyncInterfaces, а затем использовать библиотеку AWS, которая полагалась на него. Как только метод не удался, я добавил сборку, но для этого сеанса было уже слишком поздно. Итак, исправление здесь заключалось в следующем:

# Load the Microsoft.Bcl.AsyncInterfaces assembly
Add-Type -Path "$(( Get-Package Microsoft.Bcl.AsyncInterfaces  ).Source | split-path -Parent)/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll"

# Read a DynamoDB table from AWS
$regionEndpoint = [RegionEndPoint]::GetBySystemName('us-west-2')
$client = [AmazonDynamoDBClient]::new($regionEndpoint)

[DocumentModel.Table]::LoadTable($client, 'MyDDBTableName') # This is the call that was failing before, succeeds now
person Bender the Greatest    schedule 19.10.2020
comment
Рад слышать, что ты понял это. Обратите внимание, что метод Install-Package установки необходимых сборок из пакета NuGet работал в этом случае, но не работает, если пакет имеет зависимости: см. этот ответ. - person mklement0; 20.10.2020