2017-05-23 1 views
0

Ich versuche einige alte .net-Code zu .net Core. Ich bin nicht sehr vertraut mit dem, was ich umwandeln, aber es ist ein einfacher Code-Generator mit CodeDom. Soweit ich das beurteilen kann, muss ich Roslyn in .net Core verwenden.Erstelle eine Klasse mit Roslyn ... wie kompiliere ich sie jetzt?

Dies ist, was ich in den alten Code hatte:

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"); 

und das ist, was ich bisher in Roslyn haben:

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

Edit: das ist, was ich hinzugefügt haben
---

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); 

---

Ich sehe nichts darüber obwohl "Kompilieren". Ich habe keine nützlichen Beispiele online oder Dokumentationen gefunden, die nicht nur übermäßig komplex waren. Gibt es etwas Einfaches, das ich vermisse?

Antwort

1

Sie suchen nach der CSharpCompilation.Create() method, die SyntaxTrees und Referenzen verwendet.

Sie können dann ihre verschiedenen Emit() Methoden aufrufen, um sie zu einem Stream zu kompilieren.

+0

Kennen Sie Beispiele? Ich habe versucht, einige zu finden, aber keine, die versuchen, dasselbe zu erreichen wie ich. Ich habe eine Kompilationseinheit hinzugefügt, aber ich bin mir nicht sicher, was ich mit Emit tun soll. – user3715648

+0

Sie benötigen eine 'CSharpCompilation', keine' CompilationUnitSyntax'. Wenn Sie 'Create()' aufrufen, erhalten Sie ein Objekt mit einem Bündel von 'Emit()' Überladungen (einige davon sind Erweiterungsmethoden). Das ergibt einen Stream mit einer Assembly. – SLaks

+0

Sorry, ich habe vergessen, wo ich war, als ich das gestern gemacht habe. Ich habe ein paar Dinge hinzugefügt (OP hinzugefügt), und jetzt hat das Ergebnis von Emit() keine Fehler. Ich habe den Stream, aber ich bin mir nicht sicher, was ich damit tun soll ... Ich habe einige alte Beispiele gesehen, wo Leute var ourAssembly = Assembly.Load (ms.ToArray());, aber das tut nicht Arbeit mehr; Assembly.Load erwartet einen AssemblyName, keinen Byte-Stream. – user3715648

Verwandte Themen