2017-05-23 59 views
0

我正在嘗試一些舊的.net代碼.net核心。我不太熟悉我正在轉換的內容,但它是使用CodeDom的簡單代碼。從我所知道的情況來看,這意味着我需要在.net Core中使用Roslyn。使用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

您正在尋找帶有SyntaxTrees和引用的CSharpCompilation.Create() method

然後,您可以調用其各種Emit()方法編譯爲流。

+0

你知道任何例子嗎?我試過找到一些,但沒有一個試圖完成和我一樣的事情。我已經添加了一個編譯單元,但我不確定我需要用Emit做什麼。 – user3715648

+0

您需要一個'CSharpCompilation',而不是'CompilationUnitSyntax'。調用它的'Create()'會給你一個帶有一堆'Emit()'重載(其中一些是擴展方法)的對象。這將給一個組件流。 – SLaks

+0

對不起,我昨天做了這件事以後,我忘了自己在哪裏。我添加了一些東西(添加了OP),現在Emit()的結果沒有失敗。我有這個流,但我不知道該怎麼做......我見過一些老例子,其中人們做var ourAssembly = Assembly.Load(ms.ToArray());,但那不工作了; Assembly.Load需要一個AssemblyName,而不是一個字節流。 – user3715648

相關問題