多平台MAUI项目引用.NET7.0类库时找不到平台特定DLL
问题描述
我有一个包含多个项目的多平台MAUI解决方案,其中一个项目引用需要根据平台切换,因此我将其从.sln文件(GUI默认添加位置)移至项目文件中作为条件元素:
<ItemGroup> <ProjectReference Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) != 'android'" Include="..\NonAndroidLibrary\NonAndroidLibrary.csproj" > <Project>{8cd7a9a7-9740-4f03-83bc-4ae8f09cdcb9}</Project> <Name>NonAndroidLibrary</Name> </ProjectReference> ... </ItemGroup>
该类库项目仅面向.NET7.0,但我遇到了找不到平台特定二进制文件的错误:
Error WMC1006 Cannot resolve Assembly or Windows Metadata file 'M:\repos\MainSolution\NonAndroidLibrary\bin\Debug\net7.0-windows10.0.19041.0\NonAndroidLibrary.dll' MainProject M:\repos\MainSolution\MainProject\MainProject.csproj 1 Error CS0006 Metadata file 'M:\repos\MainSolution\NonAndroidLibrary\bin\Debug\net7.0-windows10.0.19041.0\NonAndroidLibrary.dll' could not be found MainProject (net7.0-android) M:\repos\MainSolution\MainProject\CSC 1 Active
第二个错误(CS0006)在其他平台上重复出现,而WMC1006目前仅在Windows平台显示。另一个仍在.sln中引用的.NET7.0项目未出现此问题,其debug\.net7.0\下的单个输出DLL可被正确引用。请问如何在.csproj中为多目标应用引入与平台无关的DLL?
解决方案
问题根源是MAUI多目标项目默认会为每个目标平台,尝试匹配对应框架的引用输出,但你的类库只编译了通用的net7.0版本,没有平台特定的目标文件,所以才会报错找不到对应路径下的DLL。
解决方法很简单,在ProjectReference里明确指定要引用的目标框架,让MAUI项目直接使用类库的通用输出:
<ItemGroup> <ProjectReference Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) != 'android'" Include="..\NonAndroidLibrary\NonAndroidLibrary.csproj" SetTargetFramework="TargetFramework=net7.0" PrivateAssets="all" > <Project>{8cd7a9a7-9740-4f03-83bc-4ae8f09cdcb9}</Project> <Name>NonAndroidLibrary</Name> </ProjectReference> </ItemGroup>
SetTargetFramework:强制MAUI项目引用类库的net7.0目标,而不是尝试找平台特定的版本PrivateAssets="all":可选配置,避免该类库的依赖被传递到MAUI项目中,按需添加即可
如果上面的方法不生效,也可以尝试直接引用编译好的DLL文件,但这种方式无法自动触发类库的编译,不如ProjectReference灵活:
<ItemGroup> <Reference Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) != 'android'" Include="NonAndroidLibrary" HintPath="..\NonAndroidLibrary\bin\$(Configuration)\net7.0\NonAndroidLibrary.dll" /> </ItemGroup>
内容的提问来源于stack exchange,提问作者Bob Sammers
相关产品推荐
相关产品推荐

