为何同解决方案中.NET7的Domain项目编译正常,Client项目引用Morris.Moxy报CS0012错误?
问题原因与解决方案
核心原因
这个编译错误的本质是:作为Roslyn代码生成器的Morris.Moxy,在编译Client项目的过程中,其运行时无法找到.NET Standard 2.0程序集的依赖。
虽然Morris.Moxy本身目标框架是.NET Standard 2.0,但Roslyn生成器是在宿主编译进程(这里是.NET 7的编译环境)中运行的。Domain项目能正常编译,是因为它自身或依赖的其他库间接引入了netstandard程序集,让编译进程自动加载了该程序集;而Client项目没有这类间接依赖,导致生成器运行时找不到ValueType所在的netstandard程序集,触发CS0012错误。
解决办法
1. 给Client项目手动添加netstandard程序集引用
在Client项目的.csproj文件中添加以下配置,直接引入netstandard程序集:
<ItemGroup> <Reference Include="netstandard"> <HintPath>$(NETStandardLibraryPath)\netstandard.dll</HintPath> </Reference> </ItemGroup>
或者通过NuGet包间接引入(更简洁):
<ItemGroup> <PackageReference Include="NETStandard.Library" Version="2.0.3" PrivateAssets="all" /> </ItemGroup>
PrivateAssets="all"的作用是避免把这个依赖传递到Client项目的输出程序集中,因为Client本身是.NET 7项目,不需要直接依赖netstandard包。
2. 检查Client项目的框架引用配置
- 确认Client项目的
.csproj中目标框架配置正确:<TargetFramework>net7.0</TargetFramework>,没有混合旧框架的设置。 - 如果项目中存在
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>这类禁用隐式框架引用的配置,需要移除该配置,或者手动添加必要的框架引用。
3. 升级生成器的目标框架(可选)
如果不需要兼容旧版本项目,可以把Morris.Moxy的目标框架升级到.NET Standard 2.1或直接.NET 7,这样能减少跨框架依赖的解析问题,从根源避免这类错误。
内容的提问来源于stack exchange,提问作者Peter Morris
相关产品推荐
相关产品推荐

