解决NETSDK1152:WinMD文件多发布输出路径冲突问题
构建主项目DesktopWidgets3时触发NETSDK1152错误,提示Microsoft.Windows.Widgets.winmd文件路径冲突——工具项目DevHome.Dashboard的该文件被复制到主项目输出目录,与主项目MsixContent下的同名文件重复。需要保留工具项目对该winmd文件的使用,同时阻止其被复制到主项目。
问题原因
DevHome.Dashboard中将Microsoft.Windows.Widgets.winmd标记为Content类型并设置CopyToOutputDirectory="PreserveNewest",当主项目引用该工具项目时,默认会继承并复制这些内容文件到自身输出目录,导致与主项目已存在的同名文件冲突。
解决方案
方案1:标记工具项目的winmd文件为私有(推荐)
在DevHome.Dashboard.csproj中,给冲突的Content项添加Private="true",标记该文件为私有,不会被引用它的项目复制:
<ItemGroup> <Content Include=".\BuildAssets\Microsoft.Windows.Widgets.Internal.winmd" Link="Microsoft.Windows.Widgets.Internal.winmd" CopyToOutputDirectory="PreserveNewest" /> <Content Include=".\BuildAssets\Microsoft.Windows.Widgets.winmd" Link="Microsoft.Windows.Widgets.winmd" CopyToOutputDirectory="PreserveNewest" Private="true" /> </ItemGroup>
该设置不会影响工具项目自身的构建和运行,仅阻止文件传递到引用项目。
方案2:在主项目中排除特定内容文件
修改DesktopWidgets3.csproj的ProjectReference,通过ExcludeAssets排除工具项目中的冲突文件:
<ItemGroup> <ProjectReference Include="..\Tools\DevHome.Dashboard\DevHome.Dashboard.csproj"> <!-- 排除所有内容文件,或精确指定单个文件 --> <ExcludeAssets>ContentFiles</ExcludeAssets> <!-- 精确排除:<ExcludeAssets>..\Tools\DevHome.Dashboard\BuildAssets\Microsoft.Windows.Widgets.winmd</ExcludeAssets> --> </ProjectReference> </ItemGroup>
如果上述设置无效,可直接在主项目中移除该文件的引用:
<ItemGroup> <Content Remove="Microsoft.Windows.Widgets.winmd" /> </ItemGroup>
方案3:调整工具项目的文件类型
由于工具项目已通过<Reference>节点引用Microsoft.Windows.Widgets.winmd用于编译,可将其从Content改为None,避免不必要的复制:
<ItemGroup> <Content Include=".\BuildAssets\Microsoft.Windows.Widgets.Internal.winmd" Link="Microsoft.Windows.Widgets.Internal.winmd" CopyToOutputDirectory="PreserveNewest" /> <None Include=".\BuildAssets\Microsoft.Windows.Widgets.winmd" Link="Microsoft.Windows.Widgets.winmd" /> </ItemGroup>
此方式保留工具项目对该文件的编译引用,同时不再将其作为内容文件复制到输出目录,从根源避免冲突。
内容的提问来源于stack exchange,提问作者Jack Ye

