首页 文章

WCELOAD无法安装压缩的CAB文件

提问于
浏览
3

我想通过替换机柜中的文件来操作我们使用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文件的信息 .

Update: 经过一些研究后,我发现WCELOAD支持MSZIP算法,而Microsoft库使用LZX . 所以我正在寻找一个能够使用MSZIP算法创建压缩CAB文件的库 .

1 回答

  • 2

    Microsoft.Deployment.Compression.Cab.dll 使用的打包程序是系统文件 cabinet.dll 的托管包装程序,它支持MSZIP算法 . 由于MS-RL对我的项目没有问题,我下载了WIX sources并修改了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文件 .

相关问题