netstandard2.0中Microsoft.CodeAnalysis.CSharp编译含dynamic代码报错
解决netstandard2.0中使用Microsoft.CodeAnalysis.CSharp编译含dynamic代码的CS1980错误
出现CS1980异常(找不到System.Runtime.CompilerServices.DynamicAttribute)的核心原因是:在netstandard2.0环境下,使用Roslyn编译含dynamic关键字的代码时,必须显式添加对相关依赖程序集的引用,默认编译配置不会自动引入这些支持动态类型的组件。
解决步骤:
1. 编译时显式添加必要的程序集引用
在创建CSharpCompilation实例时,必须包含以下关键程序集的引用:
Microsoft.CSharp.dll:提供动态绑定的运行时支持System.Runtime.dll:包含DynamicAttribute类型- 基础的核心程序集(如
object、Task所在的程序集)
示例代码:
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; // 解析待编译代码为语法树 var parseOptions = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp7_3); var syntaxTree = CSharpSyntaxTree.ParseText(yourCodeString, parseOptions); // 构建编译引用集合 var references = new[] { // 基础类型所在程序集 MetadataReference.CreateFromFile(typeof(object).Assembly.Location), // Task类型所在程序集 MetadataReference.CreateFromFile(typeof(Task).Assembly.Location), // 动态绑定支持程序集 MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo).Assembly.Location), // DynamicAttribute所在程序集 MetadataReference.CreateFromFile(typeof(System.Runtime.CompilerServices.DynamicAttribute).Assembly.Location) }; // 创建编译实例 var compilation = CSharpCompilation.Create( "YourAssemblyName", syntaxTrees: new[] { syntaxTree }, references: references, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithLanguageVersion(LanguageVersion.CSharp7_3) ); // 执行编译并检查结果 var emitResult = compilation.Emit("YourOutputAssembly.dll");
2. 确保项目依赖正确
在你的netstandard2.0类库项目中,通过NuGet安装以下包,确保编译时能找到对应的程序集:
Microsoft.CSharpSystem.Runtime
3. 验证C#版本配置一致性
确保CSharpParseOptions和CSharpCompilationOptions的语言版本保持一致(均设置为C#7.3或更高,只要你的代码兼容即可),避免版本不匹配导致的隐性问题。
关键说明
dynamic关键字的编译依赖DynamicAttribute和动态绑定运行时组件,这些在.NET Framework或.NET 8中可能被自动引入,但在netstandard2.0环境下,Roslyn不会自动加载这些程序集,必须手动添加引用才能完成编译。
内容的提问来源于stack exchange,提问作者Gabor Kiss
相关产品推荐
相关产品推荐

