如何使代码合约与WiX Custom Action项目完美配合?

时间:2014-10-23 21:59:28

标签: build msbuild wix code-contracts

我在包含WiX管理的自定义操作项目的解决方案中遇到了问题,该项目也使用MS RiSE Code Contracts。问题是代码契约工具失败并出现以下错误: enter image description here

我发现有关这个问题的一些嘀咕至少可以追溯到5年,但是甚至没有提示解决方案或解决方法。

作为一项实验,我尝试按如下方式评论WiX特定目标:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!--<Import Project="$(WixCATargetsPath)" />-->
  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

这允许构建完成并且代码合同分析/重写成功完成,但是它显然不会产生正确打包的自解压自定义操作。由于Windows Installer没有任何托管代码自定义操作功能,因此WiX使用在非托管包装器中包装托管代码的技巧,这是一个包含托管代码自定义操作及其依赖项的自解压存档。这是一个聪明的技巧,让我们在托管代码中编写自定义操作,并且它工作得非常好。到现在为止。

我怀疑发生的事情是,WiX构建过程将托管代码填充到一个非托管包装器中,该包装器成为项目的主要输出,然后Code Contracts实用程序会阻塞,因为它不是托管代码。我无法确定,因为代码合同构建过程不可见,所以我无法看到它是如何工作的。

上面的实验让我觉得,如果我能以某种方式将构建过程分成不同的部分,将自定义动作代码编译为bog标准C#类库项目,那么我认为在构建后的事件中将WiX包装进行操作代码契约实用程序将能够正确处理代码。问题是我对代码合同机制或WiX构建过程了解不足,无法弄清楚我在构建后事件中需要做些什么。

是否可以在批处理文件或PowerShell脚本中以某种方式执行WiX自定义操作包,可以作为构建后事件运行?我需要做什么?

1 个答案:

答案 0 :(得分:2)

查看WiX随附的DTF.chm帮助文件,在开发指南中介绍了如何使用MakeSfxCA.exe手动构建CA DLL。