使用 Roslyn 构建了一个 class...现在我该如何实际编译它?
Built up a class using Roslyn... now how do I actually compile it?
我正在尝试将一些旧的 .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);
---
不过我没看到任何关于 "compiling" 的信息。我没有在网上找到任何有用的示例或过于复杂的文档。我缺少一些简单的东西吗?
您正在寻找 CSharpCompilation.Create()
method,它采用 SyntaxTrees 和引用。
然后您可以调用其各种 Emit()
方法来编译为流。
我正在尝试将一些旧的 .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);
---
不过我没看到任何关于 "compiling" 的信息。我没有在网上找到任何有用的示例或过于复杂的文档。我缺少一些简单的东西吗?
您正在寻找 CSharpCompilation.Create()
method,它采用 SyntaxTrees 和引用。
然后您可以调用其各种 Emit()
方法来编译为流。