我想通过替换CAB文件柜中的一个文件来操作用CABWIZ生成的一个(未签名)CAB文件。目前,我正在使用Microsoft.Deployment.Compression.Cab.dll
执行此任务(提取所有文件,替换目标,重新创建文件柜),只要我不启用压缩,它就可以很好地工作。
cabInfo.Pack(workingFolder.FullName, true, CompressionLevel.None, null);
一旦我启用压缩,WM 6.5.3就不会再安装CAB文件:
安装CABFILE失败。
CABWIZ生成的原始文件是压缩的,所以我知道WM中的WCELOAD可以处理压缩文件。我搜索了Microsoft库的配置选项,但没有找到。
有没有办法用Microsoft库创建压缩CAB,或者有没有其他库可以用于此任务?有很多库可以操作CAB文件,但我找不到关于可以创建与WCELOAD兼容的压缩CAB文件的库的信息。
更新:经过一些研究,我发现WCELOAD支持MSZIP算法,而Microsoft库使用LZX。因此,我正在寻找一个能够使用MSZIP算法创建压缩CAB文件的库。
Microsoft.Deployment.Compression.Cab.dll
使用的打包器是系统文件cabinet.dll
的托管包装器,它支持MSZIP算法。由于MS-RL对我的项目来说没有问题,我下载了WIX源代码,并修改了CAB压缩库,如下所示:
压缩级别.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
}
}
WCELOAD使用MSZIP算法进行压缩,安装生成的CAB文件时不会出现任何问题。