【发布时间】:2017-08-25 17:43:03
【问题描述】:
出于测试目的,我需要从包含源代码的字符串source 中获取System.Reflection.Assembly。我正在使用罗斯林:
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 我想发出一个类库,而不是一个可执行程序集。该怎么做?
【问题讨论】:
-
so 将源字符串动态转换为 c# 代码,然后查询命名空间的..
-
对于缺少引用
mscorlib的部分,这可能是一个解决方案:stackoverflow.com/a/49992566/253938
标签: c# .net reflection roslyn roslyn-code-analysis