2012-04-27 61 views
3

我發一些IL,在這裏我的代碼:IL無效的程序,不明白爲什麼

mgen.Emit(OpCodes.Ldc_I4,0); 
mgen.Emit(OpCodes.Newarr, typeof(object)); 
mgen.Emit(OpCodes.Stloc_1); // THIS SHOULD      


mgen.Emit(OpCodes.Ldloc_1); // MATCH THIS ONE 
mgen.Emit(OpCodes.Callvirt, typeof(IInternalFactory).GetMethod("Create")); 
mgen.Emit(OpCodes.Castclass, method.ReturnType); 
mgen.Emit(OpCodes.Ret); 

這是一項正在進行的工作,我已經創建一個數組,現在我準備與它做一些事情,所以我決定將它存儲(Stloc_1),然後儘快將它推回到堆棧(Ldloc_1),只要我做了這些指示IL被髮信號無效,但如果我理解正確,這些指令應該離開堆棧未修改。沒有這兩條指令,IL完美地工作。所以我不能不明白爲什麼隨後推送的流行音不起作用。

+2

您是否確實創建了您試圖存儲的地方? – Sven 2012-04-27 09:00:59

+0

@Sven謝謝,這是我的問題的正確答案,如果你想發帖,我會接受:) – 2012-04-27 09:03:31

+0

我已經添加了答案。 – Sven 2012-04-27 09:07:28

回答

5

在將值存儲在本地之前,必須使用ILGenerator.DeclareLocal方法聲明本地。引用不存在的本地將導致JIT編譯器聲明程序無效。

相關問題