2011-08-08 30 views
1

調用一個函數,它返回一個object後,我嘗試在堆棧中的值存儲在一個局部變量,然後將其推回,但它失敗的異常一個簡單的流行,然後加載回不起作用

異常被拋出與調用的目標

代碼如下:

..... 

MethodInfo checked_static = typeof(NameSpace1.Class1).GetMethod(
    "Check", new Type[1] { typeof(object) }); 
adderIL.Emit(OpCodes.Callvirt, checked_static); 
adderIL.Emit(OpCodes.Stloc_3); 
adderIL.Emit(OpCodes.Ldloc_3); 
adderIL.Emit(OpCodes.Brfalse, TRUE); 

..... 

如果我刪除Stloc_3Ldloc_3一切正常,我迷失在這裏。

+0

您的當地聲明如何? – kvb

+0

記錄異常的InnerException。 –

+0

errr,我們必須聲明局部變量?不會Ldloc_3將值上傳到函數中每個堆棧的局部變量數組中? –

回答

1

根據你對我的問題的迴應,看起來你還沒有宣佈你的本地。 IL中的每種方法都表示它使用的所有本地人的類型,因此您需要使用adderIL實例上的DeclareLocal過載之一來聲明它。如果你還沒有宣佈任何其他當地人,那麼你還需要使用OpCodes.Stloc_0,而不是OpCodes.Stloc_3(同樣負載);或者,您可以使用OpCodes.StlocOpCodes.Stloc_S,並將來自DeclareLocal調用的LocalBuilder實例作爲第二個參數傳遞給adderIL.Emit(在這種情況下,Reflection.Emit庫將從本地爲您獲取正確的索引)。

+0

啊,我明白了,但是我們什麼時候可以使用Stloc_3,因爲它與Stloc_0相同,但是在不同的索引處? –

+0

@KiNGPiN - 如果你有4位當地人,那麼你可以使用'Stloc_3'訪問第四位;如果你只有一個本地,那麼你只需使用'Stloc_0'。 – kvb

+0

哦,我明白了,thx很多:) –