使用Roslyn构建了一个类......现在我该如何编译它?

时间:2017-05-23 19:45:00

标签: c# asp.net-core code-generation roslyn

我正在尝试将一些旧的.net代码添加到.net Core。我不太熟悉我正在转换的东西,但它是一些使用CodeDom的简单代码。据我所知,这意味着我需要在.net Core中使用Roslyn。

这就是我在旧代码中所拥有的:

var thing = new CodeTypeDeclaration("test");
wrapper.IsClass = true;
wrapper.TypeAttributes = TypeAttributes.Public;

AddPropertyHelper(thing, typeof(string), "some_prop");
...
...
...
var compiler = CodeDomProvider.CreateProvider("CSharp");
var options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = true;
options.OutputAssembly = Path.GetTempFileName();
var results = provider.CompileAssemblyFromDom(options);
return results.CompiledAssembly.GetType(GeneratedNamespace + "." + "test");

这就是我目前在罗斯林所拥有的:

var @namespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(GeneratedNamespace));
var classDeclaration = SyntaxFactory.ClassDeclaration("test");
classDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
AddPropertyToWrapped(classDeclaration, typeof(string), "some_prop");

编辑:这是我添加的内容
---

var cu = SyntaxFactory.CompilationUnit();
cu.AddMembers(@namespace);
var compilation = CSharpCompilation.Create(
            "foo",
            syntaxTrees: new[] { cu.SyntaxTree },
            options: options,
            references: new[] {
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "mscorlib.dll"),
                MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "System.Runtime.dll")
            });
var ms = new MemoryStream();
var emitResult = compilation.Emit(ms);

---

虽然我没有看到任何关于“编译”的内容。我没有在网上找到任何有用的例子,也没有找到过于复杂的文档。有什么简单的东西我不见了吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找CSharpCompilation.Create() method,它需要使用SyntaxTrees和引用。

然后,您可以调用其各种Emit()方法来编译为流。