Как бы я использовал Sevenzipsharp с этим кодом? - PullRequest
10 голосов
/ 24 июня 2010

Я пробовал множество различных способов заставить это работать, и я заставил это работать в основном, но я не могу получить WaitForExit (); работать так, как они делают здесь ... так как бы мне преобразовать это для работы с sevenzip? потому что я не могу заставить его работать, а также я SFX-паролей, так что они не могут быть доступны, кроме как с помощью программы и как для добавления 7z.DLL я не могу добавить его, потому что я получаю ошибку:

Не удалось добавить ссылку на 7za.dll. убедитесь, что файл доступен и является допустимым компонентом сборки или COM.

string tempFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
System.Diagnostics.Process defrag1 = System.Diagnostics.Process.Start(@"AusLogics_Defrag.exe", string.Format(" -o{0} -y -Pthisisthepass", tempFolder));
defrag1.WaitForExit();
string executableDirectoryName = Path.GetDirectoryName(Application.ExecutablePath);
System.Diagnostics.Process defrag2 = System.Diagnostics.Process.Start(tempFolder + "\\" + "AusLogics_Defrag" + "\\" + "DiskDefrag.exe", "");
defrag2.WaitForExit();
System.IO.Directory.Delete(tempFolder + "\\" + "AusLogics_Defrag", true);

new: хорошо, это то, что у меня есть, но я получаю эту ошибку "Не удается загрузить библиотеку 7-zip или внутренняя ошибка COM! Сообщение: не удалось загрузить библиотеку"

SevenZipExtractor.SetLibraryPath("7z.dll"); //no idea of this is needed or not
SevenZipCompressor.SetLibraryPath("7z.dll"); //no idea of this is needed or not
string tempFolder = Environment.GerFolderPath(Environment.SpecialFolder.ApplicationData);
SevenZipExtractor defrag = new SevenZipExtractor(@"Programs\Optimize\Auslogics_Defrag.7z");
defrag.ExtracArchive(string.Format("-o{0} -y -PThisisthepass", tempFolder));

Ответы [ 3 ]

23 голосов
/ 19 декабря 2011

Сошлитесь на SevenZipSharp.dll из вашего проекта .NET и убедитесь, что у вас есть 7z DLL, скопированная в целевой выходной каталог как событие после сборки. Так как 7z.dll не является сборкой .NET, ваш проект .NET не может ссылаться на него напрямую.

Существует два типичных объяснения «Не удается загрузить библиотеку 7-zip или внутренняя ошибка COM! Сообщение: не удалось загрузить библиотеку»:

  1. Очевидно, что 7z DLL не может быть найдена. В этом случае вызовите SevenZipCompressor / SevenZipExtractor.SetLibraryPath () с полным путем к DLL, прежде чем делать какие-либо связанные вызовы SevenZipSharp. Относительные пути также должны работать, но попробуйте абсолютные, если какой-то код изменил текущую директорию процесса. Одна из стратегий для получения абсолютного пути - использовать путь исполняемой сборки, см. Пример ниже.

  2. Архитектура библиотеки DLL, на которую ссылаются, не соответствует текущему процессу. Например, ваша сборка .NET работает под управлением x64, но вы ссылаетесь на 32-битную версию 7z.dll. В этом случае вам нужно будет ссылаться на 7z64.dll. Загрузите 7-Zip DLL-файлы из выпуска от SevenZipSharp, чтобы убедиться, что нет других проблем с несоответствием, и убедитесь, что вы используете правильную версию.

Вот пример того, как установить абсолютный путь к 7z.dll, если он находится в том же каталоге, что и сборка, использующая его:

SevenZip.SevenZipCompressor.SetLibraryPath(
    Path.Combine(
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),  
        "7z.dll"));
1 голос
/ 29 сентября 2016

Если вы используете 32-битную версию .dll, вы можете попробовать настроить свой проект на 32-битную архитектуру.

  - From project properties...   Build  >  check "Prefer 32-bit"
1 голос
/ 24 июня 2010

Вам нужно добавить ссылку на SevenZipSharp.dll, а не на обычный 7za.dll или 7z.dll.

Поскольку вам нужно иметь доступ к 7zip-библиотекам, вам нужно упаковать их вместе с кодом - это не значит, что вам нужно ссылаться на них.

Вы можете добавить папку решения / проекта в свое приложение и добавить туда необходимые DLL. Убедитесь, что для свойства «Копировать в каталог сборки» установлено значение «Копировать, если новее».

...