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

polhcujo  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(180)

当我在MSBuild中构建项目时,heat.exe出现了问题。我收到以下错误消息:
未处理的异常:系统错误图像格式异常:未能加载文件或程序集“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>

感谢你的帮助,

tez616oj

tez616oj1#

由于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

hujrc8aj

hujrc8aj2#

更新:WiX的问题数据库中似乎有一个已关闭的问题,您应该先查看一下。请检查问题描述是否与您遇到的问题相似https://github.com/wixtoolset/issues/issues/2467

它似乎与64位MSBuild有关-并且异常与您描述的相同。也许可以从底部向上阅读评论-底部有一条2017年的最新评论。
我天真的第一个想法是,是否可以运行32位MSBuild?(我对此了解不多),或者如链接问题底部评论中提到的,将可执行文件作为外部进程运行?

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

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

ftf50wuq

ftf50wuq3#

自从我切换到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
hc2pp10m

hc2pp10m4#

我通过将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>

我意识到,因为我的cake脚本要求MSBuild-x64构建解决方案,它不知何故无法运行32位HeatDirectory命令,但我不确定Exec如何在x64管道中工作,而HeatDirectory却不能。
此外,一个64位的应用程序肯定可以执行一个32位的应用程序,这是不可能的,只有其他的方式。但没有其他在互联网上为我工作。

相关问题