Roslyn 编译器看不到引用

Roslyn compiler does not see references

提问人:szajch 提问时间:10/29/2023 最后编辑:marc_sszajch 更新时间:10/31/2023 访问量:60

问:

我正在尝试创建一个能够编译另一个 .NET 6.0 应用程序的 .NET 6.0 应用程序。问题是 Roslyn 似乎没有看到参考资料。

这些是我从 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"))
};

但它似乎不起作用。

有什么想法吗?

C# .net-core net-6.0 Roslyn

评论

0赞 Progman 10/29/2023
欢迎来到 Stack Overflow。请参加导览,了解 Stack Overflow 的工作原理,并阅读如何提问,了解如何提高问题的质量。然后编辑您的问题,将您的源代码作为可重复的最小示例包含在内,该示例可以由其他人编译和测试以更快地提供答案。请参阅:为什么“有人可以帮助我吗?”不是一个实际的问题?请参阅:“它不起作用”是什么意思?

答:

1赞 Youssef13 10/31/2023 #1

不应以这种方式创建元数据引用。请改用 Basic.Reference.Assemblies.Net60 NuGet 包。GitHub 存储库 README 有更多关于如何使用此包的说明,但简而言之,您需要做的就是(不要忘记)。var references = ReferenceAssemblies.Net60using Basic.Reference.Assemblies;

评论

0赞 szajch 10/31/2023
就这样做了.但是错误是一样的,仍然缺少命名空间等。.AddReferences(Net60.References.All).AddReferences(MetadataReference.CreateFromFile(Path.Combine(dp, "BouncyCastle.Crypto.dll")
0赞 szajch 11/1/2023
Nevermid,我想通了。原因是缺少子库,例如 .using System.XXXSystem.Net.Http