簡體   English   中英

Mac OS X / Mono下的ldfld問題,可能是Mono錯誤

[英]Ldfld problems under Mac OS X / Mono, probably Mono bug

我正在使用第3方庫JInt(JavaScript中斷程序),該庫工作正常,直到切換到Mac OS X,此后,我繼續獲取ArgumentNullExceptions,經過一番調查,我發現JInt使用動態代碼生成來制作某種Js-Clr橋。 最后,此方法具有以下說明:

code.Emit(OpCodes.Ldnull);
FieldInfo fieldInfo = typeof(JsUndefined).GetField("Instance");
code.Emit(OpCodes.Ldfld, fieldInfo);

這是這些行的執行方式( 此處為完整屏幕截圖)

在此處輸入圖片說明

可以清楚地看到fieldInfo參數不為null,盡管在執行這些行時,請注意LDFLD沒有參數! 此處為完整屏幕截圖):

在此處輸入圖片說明

我當前要執行的語句是Ldnull,我在Ldfld上執行了“ Step In”(在Ldnull上),BANG異常發生了( 此處為全尺寸屏幕截圖):

在此處輸入圖片說明

有什么建議么?

您描述的問題是不同問題的組合:

  • IL反匯編不顯示字段操作數。 它不僅適合您的領域,而且您可以在ldsfld的反匯編中看到它。 我不必擔心,我鼓勵您報告它存在一個MonoDevelop錯誤。

  • JInt使用奇怪的模式在堆棧上加載靜態字段。 通過發出此模式,我可以在Mono 2.10.6上重現該問題和NRE。 好消息是它已在master中修復。 當您可以訪問JInt的代碼時,為了防止發生NRE,可以將else分支修改為以下內容:

    code.Emit(OpCodes.Ldsfld,typeof(JsUndefined).GetField(“ Instance”)));

這會帶你去。

ldfld應該始終帶有一個參數,否則您將獲得無效的CLR,並且運行時環境應拒絕加載它(加載時格式錯誤的CIL拋出異常的程序集)。

我認為,由於某種原因,作為ldfld參數的字段引用不能在運行時解析(盡管在創建代碼時就存在)。 一方面,這就是為什么您在IDE中獲得不帶參數的ldfld原因(它無法顯示類型,因為它無法加載它),另一方面,在執行此特定行時會得到null異常。

您確定動態創建的程序集正確引用了包含JsUndefined類型的程序集嗎? 代碼生成器可以看到它,但是生成的代碼可以看到它嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM