我正在使用 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 篡改文件以便启动服务?
我已经清理了解决方案并发布了重建,导致相同的情况。