You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:17:13