添加WCF服务引用生成的Reference.cs引用Microsoft.CodeDom而非System.CodeDom
问题根因
这是不同目标框架下WCF代理类生成工具的正常差异,不属于异常生成:
- .NET Framework 4.8项目添加WCF服务引用时,VS调用传统的SvcUtil工具生成代码,依赖System.Runtime.Serialization程序集,因此生成的标记属性为
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] - .NET 5属于.NET Core技术栈,VS会调用专门适配跨平台.NET的
Microsoft.Tools.ServiceModel.Svcutil工具生成代理类,因此会带上对应工具的GeneratedCode标记,你看到的预览版本号是VS2019 16.11.x版本内置的工具版本,并非你项目引用了预览版依赖包。
解决方案
1. 无需安装Microsoft.CodeDom相关NuGet包
你找到的Microsoft.CodeDom.Providers.DotNetCompilerPlatform是仅面向.NET Framework的包,本身就不兼容.NET 5,无需安装。Microsoft.CodeDom.Compiler.GeneratedCodeAttribute已经内置在.NET 5的基础框架中,只需要确认你的项目没有误删默认的框架引用即可正常编译。如果仍然提示找不到该类型,直接在项目.csproj文件中添加如下配置即可:
<ItemGroup> <Reference Include="Microsoft.CodeDom" /> </ItemGroup>
2. 替换预览版生成工具
如果不想使用内置的预览版工具生成代码,可以手动安装稳定版的dotnet-svcutil全局工具生成代理类:
- 打开命令行执行
dotnet tool install --global dotnet-svcutil安装稳定版工具 - 进入项目目录执行
dotnet-svcutil 你的WCF服务元数据地址生成代理类 - 生成的代码会标记稳定版工具版本,不会出现预览版号
3. 兼容旧版生成格式
如果你需要和.NET Framework项目的生成格式完全一致,可以直接将.NET Framework项目中生成的Reference.cs文件复制到.NET 5项目中,补充安装以下两个NuGet包即可正常运行:
System.ServiceModel.HttpSystem.ServiceModel.Primitives
内容的提问来源于stack exchange,提问作者Cícero Neves
相关产品推荐
相关产品推荐

