(Wix)heat.exe无法加载msbuild

时间:2018-04-23 12:33:19

标签: visual-studio msbuild wix windows-installer heat

我在heat.exe中构建项目时遇到MSBuild问题。我收到此错误消息:

  

未处理的异常:System.BadImageFormatException:无法加载   文件或程序集' file:/// C:\ Program Files(x86)\ WiX Toolset   V3.11 \ BIN \ Heat.exe'或其中一个依赖项。试图做到   加载格式不正确的程序。

我在stackoverflow上查找了一个可能的解决方案: Referred links

我试图以各种方式改变我的配置,但无法掌握所遗漏的内容。

这就是我现在配置的方式。我希望能够同时针对x64和x86平台。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<OutputPath>..\..\BuildArtifacts\SetupProjects\Myproject</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<OutputPath>..\..\BuildArtifacts\SetupProjects\Myproject</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Release</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<OutputPath>..\..\BuildArtifacts\SetupProjects\Myproject</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>..\..\BuildArtifacts\SetupProjects\Myproject</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Release</DefineConstants>
</PropertyGroup>

任何帮助表示赞赏,

3 个答案:

答案 0 :(得分:1)

更新:在WiX的问题数据库中似乎存在一个已关闭的问题,您应首先查看该问题。 请检查问题说明是否与您的体验相符https://github.com/wixtoolset/issues/issues/2467

它似乎与 64位MSBuild 相关 - 并且异常与您描述的相同。也许从下往上阅读评论 - 最近有评论从2017年开始。

我天真的首先想到的是你是否可以运行32位MSBuild? (我对此并不了解)。或者如链接问题的底部注释中所述,将可执行文件作为外部进程运行?

旧答案 :首先想到的是:我认为heat.exe存在64位COM文件问题。你的项目中有没有这些?刚提到它,可能还有其他原因(也是如此)。也许尝试通过删除COM文件进行测试并运行构建 - 如果可能的话。

我相信这个问题仍然存在。我不太了解它,但我被告知FireGiant的商业套件(换句话说不是免费的)处理64位文件的高级收获。

答案 1 :(得分:0)

我设法通过将wixproj更改为

来解决此问题
<Target Name="BeforeBuild">
  <HeatDirectory Directory="$(MSBuildThisFileDirectory)lib\" PreprocessorVariable="var.HarvestPath" OutputFile=".\clients\sftp\OmsFileServer\SFTPFileServerInstaller\SFTPFileServerInstaller\HeatGeneratedFileList.wxs" ComponentGroupName="HeatGenerated" DirectoryRefId="INSTALLFOLDER" AutogenerateGuids="true" ToolPath="$(WixToolPath)" SuppressUniqueIds="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true"/>
</Target>

<PropertyGroup>
  <InstallerPlatform>x64</InstallerPlatform>
  <Platform>x64</Platform>
</PropertyGroup>
<Target Name="BeforeBuild">
  <Exec Command='"$(WIX)bin\heat.exe" dir "$(MSBuildThisFileDirectory)lib" -cg HeatGenerated -dr INSTALLFOLDER -sreg -srd -var var.HarvestPath -ag -sfrag -suid -out "$(MSBuildThisFileDirectory)HeatGeneratedFileList.wxs"'/>
</Target>

我意识到,因为我的蛋糕脚本要求MSBuild-x64构建解决方案,因此它无法运行32位HeatDirectory命令,但是我不确定Exec在x64管道中的工作原理以及{{ 1}}没有。

此外,一个64位应用程序肯定可以执行一个32位应用程序,并且不可能仅以其他方式执行。但是互联网上没有其他东西对我有用。

答案 2 :(得分:0)

由于msbuild是作为64位exe运行的,因此它将无法加载32位heat.exe。要解决此问题,进程必须单独运行。可以通过将其添加到PropertyGroup来完成:

<RunWixToolsOutOfProc Condition=" '$(PROCESSOR_ARCHITECTURE)'!='x86' ">true</RunWixToolsOutOfProc>

但这还不够。 Heat确实成功忽略了该属性。相反,您必须使用属性RunAsSeparateProcess

<HeatDirectory
        ....
    RunAsSeparateProcess="$(RunWixToolsOutOfProc)" />

请参阅: https://github.com/wixtoolset/issues/issues/2467#issuecomment-736519622