Добрый день! Что-то непозволительно долго ковыряюсь с казалось бы ерундовой затеей...
Задача - динамически загрузить сборку SevenZipSharp.dll (известная библиотека для работы с архивами), затем создать экземпляр SevenZipExtractor(string ArchiveFullName) и вызвать метод ExtractArcive(string directory), который должен распаковать указанный архив в заданную директорию.
Делаю так:
//Так как зависимостей у либы нет, то гружу сборку из ресурсов в массив байт, минуя выгрузку в файл.
var resourceBuffer = Properties.Resources.ResourceManager.GetObject(resnameSevenZipSharpLibrary) as byte[];
Assembly _SevenZipSharp = Assembly.Load(resourceBuffer);
//Сборка успешно загружается, получаем инфо по типу SevenZip.SevenZipExtractor
var extaractorClassType = _SevenZipSharp.GetType(SevenZip_ExtractorClassName);
string ArchiveFullPath = "D:\\TEST.ARJ";
//Пробуем создать экземпляр класса, передав одному из конструкторов в качестве аргумента полное имя архива:
var Extractor = Activator.CreateInstance(extaractorClassType, new object[] { ArchiveFullPath });
Собственно, тут и падает приложение с ошибкой:
System.Reflection.TargetInvocationException ("Адресат вызова создал исключение.")
...
Inner excepton: System.TypeInitializationException ("Инициализатор типа "SevenZip.SevenZipLibraryManager" выдал исключение.")
в SevenZip.SevenZipLibraryManager.LoadLibrary(Object user, Enum format)
в SevenZip.SevenZipExtractor.Init(String archiveFullName)
в SevenZip.SevenZipExtractor..ctor(String archiveFullName)
Inner excepton: System.ArgumentException ("Путь имеет недопустимую форму.")`
Если задать, к примеру, путь как ArchiveFullPath = "TEST.ARJ", то он выдаст ошибку файл не найден (что совершенно логично, ибо в CurrentDirectory архива нет). Т.е. путь в виде краткого имени файла он вроде как прожевывает, а вот если указать диск, то уже не хочет.
Возможно, кто-то сталкивался с аналогичной проблемой, или может быть, что-то не то творю. Замылился уже глаз, пробовал по-разному, через GetConstructor, например.
Разумеется, до вызова метода ExtractArchive дело даже не доходит.
Да, я знаю, что можно добавить в проект еще до компиляции ссылку на сборку, и беспрепятственно использовать классы из namespace SevenZip, просьба такой вариант не предлагать. Можно было бы сделать так - не парил бы мозг и сделал бы сразу.
Спасибо за внимание!
using (var arj = new SevenZipExtractor(arjArchiveName)) { arj.ExtractArchive(targetDir); }– BlackWitcher Nov 14 '16 at 11:48