WIX篡改文件

时间:2013-07-26 17:09:07

标签: visual-studio wix installer

我正在使用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。无法找到文件或程序集“Connector,Version = 1.0.0.0,Culture = neutral,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篡改文件以便启动服务?

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

1 个答案:

答案 0 :(得分:4)

  

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

作为一种文学描述设备,这很好,但当然,这不是正在发生的事情。

我猜您的Scheduler项目有多个构建配置。而且,你正在寻找一个版本,而WiX正在抓住另一个版本,而这恰好错过了“本机”清单。

BTW-不要在同一个组件中使用多个File元素,除非它们是不可分割的(例如,在同一个.NET程序集中很少见)。请参阅Organizing Applications into Components