2012-11-21 84 views
0

我在數據庫表中存儲了一些C#代碼。用Reflection.Emit生成動態代碼

我有一個字符串中的基類的整個代碼。

在手的存儲C#代碼,我添加到類名爲m1包含的方法return <<some C# code>>;(該方法總是返回object所以C#代碼可以是:88 + 90"hello world"this.ToString()等),將其保存到一個文件並用CSharpCodeProvider進行編譯,然後在我的程序上運行它。

存儲的C#代碼可以使用基類中的一些方法。

該方案效果很好。

現在,我會使用Reflection.Emit來做到這一點,以避免編譯步驟。

這是可能的,如果是這樣,它將如何完成?

+0

您確定C#.NET是正確的工具嗎? –

+2

你是否有將數據存儲在數據庫中的原因? – siride

+1

您相當信任您的數據,以至於您願意運行由數據庫中的文本驅動的任意代碼? –

回答

1

現在,我會使用Reflection.Emit來做到這一點,以避免編譯步驟。

這對我沒有多大意義。如果您有要執行的源代碼,你基本上有兩種選擇:

  1. 編譯它,然後可以直接執行一些其他形式。 (經典編譯語言像C這樣工作。)
  2. 將它解析爲一些內存中的結構,然後逐個執行。 (經典的解釋語言就像這樣工作,就像舊版瀏覽器中的JavaScript一樣)。

由於虛擬機和中間語言等原因,事情並不像現在這麼簡單,但這些是基本選擇。

如果你不想使用CodeDOM的,離開你兩個選擇(對應於兩個以上選項):

  1. 解析代碼,然後從它創建一些可執行文件的形式,可能使用Reflection.Emit
  2. 解析代碼並直接執行結果。你不需要Reflection.Emit

選擇1表示您需要實現完整的C#編譯器。選擇2意味着你需要實現一半的C#編譯器,再加上你的內存結構的解釋器。在這兩種情況下,這將是一個巨大的項目,你不會真的「避免編譯步驟」。