Сжатые CAB-файлы не могут быть установлены WCELOAD
Я хотел бы манипулировать одним из наших (неподписанных) CAB-файлов, созданных с помощью CABWIZ, заменив файл в кабинете. В настоящее время я использую Microsoft.Deployment.Compression.Cab.dll
для этой задачи (извлеките все файлы, замените цель, заново создайте кабинет), которая работает довольно хорошо, пока я не включаю сжатие.
cabInfo.Pack(workingFolder.FullName, true, CompressionLevel.None, null);
Как только я включу сжатие, WM 6.5.3 больше не будет устанавливать CAB-файл:
Установка CABFILE была неудачной.
Исходный файл, сгенерированный CABWIZ, сжат, поэтому я знаю, что WCELOAD в WM может обрабатывать сжатые файлы. Я искал варианты конфигурации для библиотеки Microsoft, но не нашел ни одного.
Есть ли способ создать сжатый CAB с библиотекой Microsoft или есть другие библиотеки, которые можно использовать для этой задачи? Существует множество библиотек для манипулирования CAB-файлами, но я не смог найти информацию об одной, которая может создавать сжатые CAB-файлы, совместимые с WCELOAD.
Обновление: после некоторых исследований я обнаружил, что WCELOAD поддерживает алгоритм MSZIP, тогда как библиотека Microsoft использует LZX. Поэтому я ищу библиотеку, способную создавать сжатые CAB-файлы с использованием алгоритма MSZIP.
1 ответ
Упаковщик, используемый Microsoft.Deployment.Compression.Cab.dll
является управляемой оболочкой для системного файла cabinet.dll
который поддерживает алгоритм MSZIP. Поскольку MS-RL не является проблемой для моего проекта, я скачал исходники WIX и изменил библиотеку сжатия CAB следующим образом:
public enum CompressionLevel
{
/// <summary>Do not compress files, only store.</summary>
None = 0,
/// <summary>Minimum compression; fastest.</summary>
Min = 1,
/// <summary>A compromize between speed and compression efficiency.</summary>
Normal = 6,
/// <summary>Maximum compression; slowest.</summary>
Max = 10,
/// <summary>Compress files using the MSZIP algorithm.</summary>
MsZip = 11
}
private static NativeMethods.FCI.TCOMP GetCompressionType(CompressionLevel compLevel)
{
if (compLevel == CompressionLevel.MsZip)
{
return NativeMethods.FCI.TCOMP.TYPE_MSZIP;
}
else
{
// existing code goes here
}
}
Сжатый по алгоритму MSZIP, WCELOAD устанавливает сгенерированные CAB-файлы без каких-либо проблем.