【问题标题】:WIX tampers with filesWIX 篡改文件
【发布时间】:2013-07-26 17:09:06
【问题描述】:

我正在使用 WIX 为 Windows 服务创建安装程序。

服务已准备好安装(在项目中定义了ServiceInstaller)。因此,如果我使用installutil 安装该服务,它可以完美运行。

尝试创建 WIX 安装程序,我在产品中创建了以下组件:

<Component ...>
    <File Id="ServiceDll" Name="$(var.Scheduler.TargetFileName)" Source="$(var.Scheduler.TargetPath)"/>
    <File Id="Connector" Name="Connector.dll" Source="$(var.Scheduler.TargetPath)"/>
    <!-- some more dependencies -->
    <ServiceInstall Id="InstallService" Name="ScheduleService" Start="auto" Type="ownProcess" ErrorControl="normal"/>
</Component>

Scheduler 是服务项目的名称。我从 wix 项目中添加了对该项目的引用。 Connector.dll 是一个 .Net 程序集,它被复制到服务的输出目录,因为它被引用。 ScheduleService 是服务名称。

如果我运行安装程序,则服务安装成功。但是,由于程序集绑定错误,启动失败:

服务启动失败。 System.IO.FileLoadException。找不到文件或程序集“连接器,版本=1.0.0.0,文化=中性,PublickKeyToken=null”或依赖项。找到的程序集的清单定义与程序集引用不匹配 (HRESULT: 0x80131040)。 在 ScheduleService.OnStart()

我想知道为什么会出现不匹配。所以我仔细查看了这些文件。 WIX 复制到安装目录的文件实际上与源文件不同。原始文件大小为 11,776 字节,复制文件大小为 12,800 字节。如果我在 Visual Studio 中打开 dll,我会得到不同的视图:

+ Original Connector.dll
  + RT_MANIFEST
    1 [neutral]
  + Version
    1 [neutral]

+ Copied Connector.dll
  + Version
    1 [neutral]

所以 WIX 似乎已经删除了清单。如果我用原始的 DLL 覆盖复制的 DLL,我可以再次启动该服务。为什么 WIX 会这样做?更重要的是,如何阻止 WIX 篡改文件以便启动服务?

我已经清理了解决方案并发布了重建,导致相同的情况。

【问题讨论】:

  • 您确定不是在一个位置构建,然后从另一个位置获取安装程序的源文件吗?

标签: visual-studio wix installation


【解决方案1】:

所以 WIX 似乎已经删除了清单。

作为一种文学描述手段,这很好,但当然,事实并非如此。

我猜您的调度程序项目有多个构建配置。而且,您正在查看一个构建,而 WiX 正在抓取另一个构建,而后者恰好缺少“本机”清单。

顺便说一句-不要在同一个组件中使用多个 File 元素,除非它们是不可分割的(例如,在同一个 .NET 程序集中,这种情况很少见)。见Organizing Applications into Components

【讨论】:

  • 该死,我为每个条目定义了相同的源文件。这就是程序集有不同清单的原因。
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多