(Wix) heat.exe 无法使用 msbuild 加载

(Wix) heat.exe could not be loaded with msbuild

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

Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'file:///C:\Program Files (x86)\WiX Toolset v3.11\bin\Heat.exe' or one of its dependencies. An attempt was made to load a program with an incorrect format.

我在这里查找了关于 Whosebug 的可能解决方案: 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>

感谢任何帮助,

更新:WiX 的问题数据库中似乎有一个已解决的问题,您应该首先检查一下。 请检查问题描述是否与您的经历相符https://github.com/wixtoolset/issues/issues/2467

它似乎与 64 位 MSBuild 有关 - 异常与您描述的相同。也许自下而上阅读评论 - 底部有一条 2017 年的最新评论。

我天真的第一个想法是,您是否可以 运行 32 位 MSBuild? (我对此了解不多)。或者如链接问题底部评论中所述,运行 可执行文件作为外部进程?


旧答案:首先想到的是:我相信heat.exe对64位COM有问题文件。你的项目中有这些吗?只是提到它,可能还有另一个原因(也是)。也许尝试通过删除 COM 文件和 运行 构建来进行测试 - 如果可能的话。

我相信这个问题也仍然存在。我对此了解不多,但我听说 FireGiant 的商业工具包(换句话说不是免费的)可以处理 64 位文件的高级采集。

我设法通过从

更改 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 管道而 HeatDirectory 没有。

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

由于 msbuild 运行s 作为 64 位 exe,它将无法加载 32 位 heat.exe。要解决此问题,进程必须单独 运行。这可以通过将其添加到 属性Group:

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

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

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

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

自从我切换到 Visual Studio 2022 后,我的命令 MSBuild c:\project\Setup\Setup.wixproj 不再有效。我通过直接调用 32 位 MSBuild 可执行文件解决了这个问题:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe c:\project\Setup\Setup.wixproj