gpt4 book ai didi

c# - 无法从源代码在 Roslyn 中创建编译

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:21 27 4
gpt4 key购买 nike

出于测试目的,我需要从包含源代码的字符串 source 中获取 System.Reflection.Assembly。我正在使用 Roslyn:

SyntaxTree tree = CSharpSyntaxTree.ParseText(source);
CSharpCompilation compilation = CSharpCompilation.Create("TestCompilation", new[] { tree });

Assembly assembly = null;
using (var stream = new MemoryStream())
{
var emitResult = compilation.Emit(stream);
if (!emitResult.Success)
{
var message = emitResult.Diagnostics.Select(d => d.ToString())
.Aggregate((d1, d2) => $"{d1}{Environment.NewLine}{d2}");

throw new InvalidOperationException($"Errors!{Environment.NewLine}{message}");
}

stream.Seek(0, SeekOrigin.Begin);
assembly = Assembly.Load(stream.ToArray());
}

如您所见,我在这里的尝试是发出一个 CSHarpCompilation 对象,以便我稍后可以获取 Assembly。我正在尝试这样做:

var source = @"
namespace Root.MyNamespace1 {
public class MyClass {
}
}
";

发出错误

但我在 var emitResult = compilation.Emit(stream) 处失败并输入显示错误的条件。我收到 1 个警告和 3 个错误:

  • 警告 CS8021:未找到 RuntimeMetadataVersion 的值。未找到包含 System.Object 的程序集,也未找到通过选项指定的 RuntimeMetadataVersion 值。
  • (3,34):错误 CS0518:未定义或导入预定义类型“System.Object”
  • (3,34):错误 CS1729:“对象”不包含采用 0 个参数的构造函数
  • 错误 CS5001:程序不包含适合入口点的静态“Main”方法

所以我似乎需要添加对 mscorelib 的引用,而且我似乎还需要告诉 Roslyn 我想发出一个类库,而不是一个可执行程序集。如何做到这一点?

最佳答案

您缺少对 mscorlib 的元数据引用,您可以通过 CSharpCompilationOptions 更改编译选项。

按如下方式创建您的编译:

var Mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CSharpCompilation.Create("TestCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib }, options: options);

关于c# - 无法从源代码在 Roslyn 中创建编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com