2009-08-17 58 views
3

.NET Framework 4.0向Reflection API引入了幾個項目,其範圍從非常有用到對我的工作至關重要。其中包括Assembly,Module,MethodBodyLocalVariableInfo以及新的CustomAttributeData類別的受保護構造函數。有一些項目我仍然需要解決相當麻煩的問題。我相信他們很容易適用於相同的[小型]人羣,因此需要擴展我剛剛列出的類型。我們可以構建一個`OpCode`的實例嗎?

這次:我正在尋找一種方法來構建我自己的參數System.Reflection.Emit.OpCode結構的實例。我目前調用內部構造函數來創建實例。這對性能沒有任何不利影響,因爲我將構造的項目公開爲類的public static readonly成員以供重用,但正如您可以想象的那樣,這是非常不理想的場景。

有什麼原因,它是不可能的,以與文檔的當前內部OpCode構造公衆,指出用戶構建OpCode s不能與ILGenerator使用。

編輯:下面是一個例子。通過創建下面的自定義操作碼,我可以在一些中間指令列表之間的字節碼轉換中使用它,而不需要創建臨時局部變量。如果我發射IL,我會將其餘的swap指令轉換爲有效的IL表示,但在我的情況下,下一步是理解自定義指令的JIT。我使用Prefix2的前綴0xFD,它被任何有效的IL操作碼保留和未使用。

/// <summary> 
/// Swaps adjacent elements on the evaluation stack. The supplied inline int32 argument gives the 
/// index of the topmost item in the pair. 
/// </summary> 
public static readonly OpCode Swap; 

我也將使用這個對於不具有簡單/常見的託管代碼表示,但在不同的本地代碼生成器提供一個簡單的依賴於平臺的表示JIT內部函數。其中之一是ldthread(加載對當前託管線程RuntimeThread表示的引用)。

+2

你的意思是http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx自1.0以來一直存在? – 2009-08-17 00:18:27

+0

是的,就是那個。 – 2009-08-17 01:02:49

回答

0

我不認爲有可能創建自定義的OpCode實例,因爲OpCode實例嚴格來自Common Language Infrastructure (CLI) documentation。所以,即使你的情況有道理,OpCode似乎也不會成爲現實。

+1

預定義的OpCode實例基於文檔,但結構本身不是TR/84的一部分。我在這個應用程序中的代碼是* so * clean的部分原因是我使用了反射來調用OpCode構造函數來創建新實例。對於任何執行IL的人來說,在將結果發送給ILGenerator之前,他們自己進行轉換,將「特殊」操作碼嵌入到中間結果中的能力可能非常有用,並且考慮到實際使用OpCode的狹窄技術用戶羣,開放似乎沒有害處這個案例。只要讓ILGenerator拋出,如果無效代碼使它那麼遠。 – 2009-12-16 16:58:05

+1

我明白需要。也許你可以遊說(在MVP的幫助下)微軟公開構造函數。 – 2009-12-16 17:26:56

0

爲什麼不使用我們自己的IL-Opcodes作爲中間結果,然後在最後一步將它們轉換爲真正的操作碼。

相關問題