Я пытаюсь загрузить сборку с помощью этого:Загрузка сборки из массива БАЙТА библиотеки DLL
$pathToDll = "C:\zip\SevenZipSharp.dll"
$pathTo7zDll = "C:\zip\7z.dll"
$dllByteArray= [System.IO.File]::ReadAllBytes($pathToDll)
[System.Reflection.Assembly]::Load($dllByteArray)
Это не бросает исключение, однако, когда я хочу использовать библиотеку SevenZip.SevenZipExtractor
так:
[SevenZip.SevenZipExtractor]::SetLibraryPath($pathTo7zDll)
Он говорит: Exception calling "SetLibraryPath" with "1" argument(s): "The type initializer for 'SevenZip.SevenZipLibraryManager' threw an exception."
Однако, если я заменю [System.Reflection.Assembly]::Load($dllByteArray)
с
Add-Type -path $pathToDll
все нормально работает.
Почему он бросает исключение, если я загружаю сборку из массива Byte?
EDIT: Поэтому я хочу, чтобы загрузить его, используя массив байт, потому что, если я использую Add-Type
, кажется, держать ручку на .dll и я не могу удалить его с помощью Remove-Item
позже.
EDIT: Это сработало:
[System.Configuration.ConfigurationManager]::AppSettings["7zLocation"] = $pathToDll
Это должно быть вызван перед вызовом [SevenZip.SevenZipExtractor]::SetLibraryPath($pathTo7zDll)
Но почему это бросает исключение, когда я вызываю [SevenZip.SevenZipExtractor] :: SetLibraryPath ($ pathTo7zDll)? –
Я предполагаю, что загружаемая сборка зависит от другой сборки, которая не может быть найдена. Сначала попробуйте загрузить недостающую сборку. Вам нужно вникнуть в подробности этого исключения - искать его InnerException и проверять его - рекурсивно до тех пор, пока InnerException не станет нулевым. –