WIX0150错误:Wix4引用多目标项目时预处理器变量未定义
问题:Wix4中通过ProjectReference依赖多目标.NET项目的配置方法
我有两个项目:ConsoleApp1(基于net7.0空项目模板)和Package1(基于Wix4安装项目空模板)。ConsoleApp1配置了<TargetFrameworks>net7.0</TargetFrameworks>(实际需求为多目标),在Package1中添加对ConsoleApp1的ProjectReference后,无法通过预处理器变量(如$(var.ConsoleApp1.TargetPath))、绑定或其他方式访问ConsoleApp1的输出文件。将ConsoleApp1的<TargetFrameworks>改为<TargetFramework>时错误消失,但我需要保留多目标配置。
ConsoleApp1.csproj 代码
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworks>net7.0</TargetFrameworks> </PropertyGroup> </Project>
Package1.wixproj 代码
<Project Sdk="WixToolset.Sdk/4.0.0-rc.1"> <ItemGroup> <ProjectReference Include="..\ConsoleApp1\ConsoleApp1.csproj"/> </ItemGroup> </Project>
ExampleComponents.wxs 代码
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> <Fragment> <ComponentGroup Id="ExampleComponents" Directory="INSTALLFOLDER"> <Component> <File Source="ExampleComponents.wxs" /> <File Source="$(var.ConsoleApp1.TargetPath)" KeyPath="yes" /> </Component> </ComponentGroup> </Fragment> </Wix>
已尝试但无效的操作
- 在wixproj中设置
TargetFramework或TargetFrameworks - 在wixproj的
ProjectReference中添加AdditionalProperties="TargetFramework=net7.0" - 查阅Wix4相关文档(内容匮乏)
解决方法
1. 明确指定ProjectReference的目标框架
修改Package1.wixproj中的ProjectReference配置,添加SetTargetFramework和ReferenceOutputAssembly属性,强制绑定到具体的目标框架:
<Project Sdk="WixToolset.Sdk/4.0.0-rc.1"> <ItemGroup> <ProjectReference Include="..\ConsoleApp1\ConsoleApp1.csproj" SetTargetFramework="TargetFramework=net7.0" ReferenceOutputAssembly="true" /> </ItemGroup> </Project>
2. 使用框架特定的预处理器变量
如果项目是多目标(如同时支持net6.0和net7.0),可以通过带框架后缀的变量访问对应输出:
<File Source="$(var.ConsoleApp1-net7.0.TargetPath)" KeyPath="yes" />
3. 显式配置多目标项目的输出路径
在ConsoleApp1.csproj中指定不同框架的输出路径,避免文件冲突:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworks>net6.0;net7.0</TargetFrameworks> <OutputPath>bin\$(Configuration)\$(TargetFramework)\</OutputPath> </PropertyGroup> </Project>
原理说明
Wix4处理多目标.NET项目时,必须明确绑定到某个具体的目标框架,否则无法确定引用的输出文件。SetTargetFramework属性可强制依赖项目构建时使用指定框架版本,让Wix正确获取TargetPath等预处理器变量。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

