備註
本主題指的是 .NET Native Developer Preview,這是發行前版本軟體。 您可以從 Microsoft Connect 網站下載預覽 (需要註冊)。
並非所有使用 .NET 原生工具鏈所開發應用程式中的元數據查閱失敗都會導致例外狀況。 有些可以在應用程式中以無法預測的方式顯示。 下列範例顯示參考空值物件所造成的存取違反:
Access violation - code c0000005 (first chance)
App!$3_App::Core::Util::NavigationArgs.Setup
App!$3_App::Core::Util::NavigationArgs..ctor
App!$0_App::Gibbon::Util::DesktopNavigationArgs..ctor
App!$0_App::ViewModels::DesktopAppVM.NavigateToPage
App!$3_App::Core::ViewModels::AppViewModel.NavigateToFirstPage
App!$3_App::Core::ViewModels::AppViewModel::<HandleLaunch>d__a.MoveNext
App!$43_System::Runtime::CompilerServices::AsyncMethodBuilderCore.CallMoveNext
App!System::Action.InvokeClosedStaticThunk
App!System::Action.Invoke
App!$43_System::Threading::Tasks::AwaitTaskContinuation.InvokeAction
App!$43_System::Threading::SendOrPostCallback.InvokeOpenStaticThunk
[snip]
讓我們嘗試使用 快速入門指南的「手動解決缺失的元數據」章節中所述的三步驟法來排除此例外狀況。
應用程式在做什麼?
首先需要注意的是堆疊基底的 async 關鍵詞機械。 判斷應用程式在 async 方法中真正執行的動作可能會有問題,因為堆疊已遺失原始呼叫的內容,並在不同的線程上執行 async 程序代碼。 不過,我們可以推斷應用程式嘗試載入其第一頁。 在 NavigationArgs.Setup的實作中,下列程式代碼造成存取違規:
AppViewModel.Current.LayoutVM.PageMap
在此情況下,LayoutVM 上的 AppViewModel.Current 屬性 null。 由於缺乏元數據,導致微妙的行為差異,屬性未被初始化,而非如應用程式預期般被設定。 在程式碼中設定斷點,在 LayoutVM 應該已經初始化的位置,可能有助於了解情況。 不過,請注意,LayoutVM的類型是 App.Core.ViewModels.Layout.LayoutApplicationVM。 rd.xml 檔案中目前唯一存在的元數據指示詞是:
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
造成失敗的可能因素是 App.Core.ViewModels.Layout.LayoutApplicationVM 缺少元數據,因為它位於不同的命名空間中。
在此情況下,為 App.Core.ViewModels 新增運行時間指示詞解決了問題。 根本原因是 API 呼叫到 Type.GetType(String) 方法,該方法傳回 null,而應用程式悄悄地忽略這個問題,直至當機發生。
在動態規劃中,使用 .NET Native 下的反射 API 時,最佳做法是使用失敗時會擲出例外的 Type.GetType 多載方法。
這是隔離案例嗎?
使用 App.Core.ViewModels時,也可能會發生其他問題。 您必須決定是否值得識別和修正每個遺漏的元數據例外情況,還是節省時間,為較大類型範疇新增指令。 在這裡,如果輸出二進位檔大小的增加不是問題,則為 dynamic 增加 App.Core.ViewModels 元數據可能是最佳方法。
是否可以重寫程序代碼?
如果應用程式已使用 typeof(LayoutApplicationVM) 而不是 Type.GetType("LayoutApplicationVM"),則工具鏈可以保留 browse 元數據。 不過,它仍然不會建立 invoke 元數據,這會導致具現化類型時 MissingMetadataException 例外狀況。 若要防止例外狀況,您仍然需要為命名空間或指定 dynamic 原則的類型新增執行時間指令。 如需執行階段指令的資訊,請參閱 執行階段指令(rd.xml)設定檔參考資料。