(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
我在 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