Roslyn编译器无法识别程序集引用问题求助
.NET 6.0下Roslyn编译程序集引用识别问题排查
我正在尝试创建一个.NET 6.0应用,用于编译另一个.NET 6.0应用,但遇到了Roslyn无法识别程序集引用的问题。
报错信息
无效程序集名称:名称包含无效字符。
找不到类型或命名空间名称“List<>”
找不到类型或命名空间名称“Task”
找不到类型或命名空间名称“StreamReader”
当前上下文中不存在名称“Environment”
当前上下文中不存在名称“String”
当前上下文中不存在名称“Array”
类型“MarshalByRefObject”定义在未引用的程序集中,需添加对“System.Runtime”程序集的引用
类型“Uri”定义在未引用的程序集中,需添加对“System.Runtime”程序集的引用
初始编译器代码
var syntaxTree = CSharpSyntaxTree.ParseText(source); var references = new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(Path.Combine(dp, "BouncyCastle.Crypto.dll")) }; var compilation = CSharpCompilation.Create(output) .WithOptions(new CSharpCompilationOptions(OutputKind.WindowsApplication)) .AddReferences(references) .AddSyntaxTrees(syntaxTree); EmitResult emitResult = compilation.Emit(output);
尝试添加更多引用后的代码
var references = new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(typeof(HttpClient).Assembly.Location), MetadataReference.CreateFromFile(typeof(System.Net.HttpWebRequest).Assembly.Location), MetadataReference.CreateFromFile(typeof(System.Text.RegularExpressions.Regex).Assembly.Location), MetadataReference.CreateFromFile(typeof(List<>).Assembly.Location), MetadataReference.CreateFromFile(typeof(Task).Assembly.Location), MetadataReference.CreateFromFile(typeof(StreamReader).Assembly.Location), MetadataReference.CreateFromFile(typeof(Environment).Assembly.Location), MetadataReference.CreateFromFile(typeof(string).Assembly.Location), MetadataReference.CreateFromFile(typeof(MarshalByRefObject).Assembly.Location), MetadataReference.CreateFromFile(typeof(Uri).Assembly.Location), MetadataReference.CreateFromFile(Path.Combine(dp, "BouncyCastle.Crypto.dll")) };
解决思路
- 校验程序集路径合法性:先排查“无效程序集名称”错误,打印所有引用的路径,确认文件存在、路径无特殊字符(比如空格、非ASCII字符),
dp变量指向的目录是否正确。 - 改用SDK风格的框架引用方式:.NET 6依赖共享框架,直接通过
typeof获取的程序集可能缺失隐式引用的核心依赖。可以借助Microsoft.CodeAnalysis.CSharp.Workspaces包自动加载框架引用:var workspace = new AdhocWorkspace(); var projectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Default, "CompiledProject", "CompiledProject", LanguageNames.CSharp) .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.WindowsApplication)); var project = workspace.AddProject(projectInfo); var compilation = await project.GetCompilationAsync(); // 手动添加自定义程序集引用 compilation = compilation.AddReferences(MetadataReference.CreateFromFile(Path.Combine(dp, "BouncyCastle.Crypto.dll"))); - 手动添加核心框架程序集:直接从.NET 6安装目录(通常为
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.x)引用必要的核心程序集:- System.Runtime.dll
- System.Collections.dll(包含
List<>) - System.Threading.Tasks.dll(包含
Task) - System.IO.dll(包含
StreamReader) - System.Runtime.Extensions.dll(包含
String、Array、Environment) - System.Net.Primitives.dll(包含
Uri) - System.MarshalByRefObject.dll(包含
MarshalByRefObject)
- 明确指定目标框架版本:在编译选项中添加目标框架标识,避免版本不匹配导致的引用识别问题:
var options = new CSharpCompilationOptions(OutputKind.WindowsApplication) .WithTargetFramework(TargetFrameworkMoniker.Net60); - 清理重复引用:移除重复的程序集引用(比如
typeof(object)和typeof(string)可能指向同一核心程序集),避免版本冲突导致Roslyn无法确定有效引用。
内容的提问来源于stack exchange,提问作者acvq136
相关产品推荐
相关产品推荐

