Сжатые 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 следующим образом:

CompressionLevel.cs

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
}

CabPacker.cs

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-файлы без каких-либо проблем.

Другие вопросы по тегам