2016-12-30 80 views
3

我有一個little library,它極大地依賴於Emitting類和方法。使用.Net標準生成代碼

我想將它遷移到.Net Standard,因爲它不使用任何非託管事物,因此可以在任何操作系統上輕鬆運行。但是當我在我的解決方案上運行Portability檢查器時,它顯示我的Expression發生器部件一切正常,但它在使用Emit時發牢騷。

這裏是對net452netstandard1.6netstandard2.0的分析。

enter image description here

我的問題是,如果有產生由淨標準或我的支持可以忘掉我的移植庫,以它在運行時類的一些現代的和推薦的方式?

+0

這將是Roslyn,推薦在C#6及以上版本中生成類的方法。 C#腳本使用它來做到這一點,從腳本文本生成並運行類 –

+0

這可以被認爲是[這個副本](http://stackoverflow.com/questions/39197663/generate-c-sharp-code-with -roslyn-and-net-core) –

+0

@PanagiotisKanavos看起來這個功能[正在建設中](https://github.com/dotnet/roslyn/issues/5561),所以Rosylin無法在構建時間atm時生成代碼。 –

回答

1

嗯,我發現,時下.Net Standard我們表達式樹產生獨立的代表和老式Emit(可帶System.Reflection.EmitSystem.Reflection.Emit.Lightweight命名空間)爲休息。不幸的是,我們失去了前者和後者之間的橋樑(我的意思是LambdaExpression.CompileToMethod,see question)。

因此,通常在完整桌面.Net中,代碼生成功能幾乎與在運行時不需要生成類型(例如實現一些接口)相同。在這種情況下,你不得不手動發射IL。

+0

我正在研究一個適用於所有框架和編譯時的基於Roslyn的解決方案。它更強大。所以,如果你必須使用它們來生成表達式。對於類生成來說,使用Roslyn API更容易,並創建一個在構建期間生成它們的插件。看到[這個項目(不是我的,我只是使用它)](https://github.com/AArnott/CodeGeneration.Roslyn)瞭解更多細節。 –