Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu konu, yayın öncesi yazılım olan .NET Native Developer Preview'ı ifade eder. Önizlemeyi Microsoft Connect web sitesinden indirebilirsiniz (kayıt gerektirir).
.NET Native araç zinciri kullanılarak geliştirilen uygulamalarda meta veri arama hatalarının tümü özel durumla sonuçlanmaz. Bazıları uygulamada öngörülemeyen yollarla bildirimde bulunabilir. Aşağıdaki örnekte, null nesneye başvuruda bulunarak oluşan erişim ihlali gösterilmektedir:
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]
Şimdi Başlarken'nin "Eksik meta verileri el ile çözme" bölümünde açıklanan üç adımlı yaklaşımı kullanarak bu özel durumu gidermeyi deneyelim.
Uygulama ne yapıyordu?
Dikkat edilecek ilk şey, yığının tabanındaki async anahtar sözcük makinesidir. Uygulamanın bir async yönteminde gerçekten ne yaptığını anlamak, yığının orijinal çağrının bağlamını kaybetmesi ve async kodunu farklı bir iş parçacığında çalıştırması nedeniyle sorunlu olabilir. Ancak, uygulamanın ilk sayfasını yüklemeye çalıştığını da anlayabiliriz.
NavigationArgs.Setupuygulamasında aşağıdaki kod erişim ihlaline neden oldu:
AppViewModel.Current.LayoutVM.PageMap
Bu örnekte, LayoutVM üzerindeki AppViewModel.Current özelliği null. Bazı meta verilerin eksikliği, ince bir davranış farkına neden olarak, uygulamanın beklentisi doğrultusunda bir özelliğin ayarlanması yerine başlatılmamasına yol açtı. Kodda LayoutVM'ın başlatılmış olması gereken bir yerde kesme noktası ayarlamak duruma ışık tutabilir. Ancak, LayoutVMtürünün App.Core.ViewModels.Layout.LayoutApplicationVMolduğunu unutmayın. rd.xml dosyasında şu ana kadar mevcut olan tek meta veri yönergesi:
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
Hata için olası bir aday, App.Core.ViewModels.Layout.LayoutApplicationVM farklı bir ad alanında olduğundan meta verileri eksik olmasıdır.
Bu durumda, App.Core.ViewModels için çalışma zamanı yönergesi eklenmesi sorunu çözdü. Kök neden, Type.GetType(String) yöntemine yapılan ve nulldöndüren bir API çağrısıydı ve uygulama çökene kadar sorunu sessizce yoksaydı.
Dinamik programlamada, .NET Native altında yansıma API'lerini kullanırken iyi bir uygulama, hata durumunda istisna atan Type.GetType aşırı yüklemelerini kullanmaktır.
Bu yalıtılmış bir dava mı?
App.Core.ViewModelskullanılırken başka sorunlar da ortaya çıkabilir. Her eksik meta veri özel durumunu tanımlamaya ve düzeltmeye veya daha büyük bir tür sınıfı için zaman kazandırmaya ve yönergeler eklemeye değip değmeyeceğine karar vermelisiniz. Burada, çıktı ikili dosyasının sonuçtaki boyut artışı sorun değilse dynamic için App.Core.ViewModels meta verileri eklemek en iyi yaklaşım olabilir.
Kod yeniden yazılabilir mi?
Uygulama typeof(LayoutApplicationVM)yerine Type.GetType("LayoutApplicationVM") kullansaydı, araç zinciri browse meta verilerini koruyabilirdi. Ancak yine de invoke meta verilerini oluşturmayacaktı ve bu da türün örneğini oluştururken MissingMetadataException özel duruma neden olacaktı. İstisnayı önlemek için, dynamic ilkesini belirten ad alanı veya tür için yine de bir çalışma zamanı yönergesi eklemeniz gerekir. Çalışma zamanı yönergeleri hakkında bilgi için bkz. Çalışma Zamanı Yönergeleri (rd.xml) Dosya Referansı.
Ayrıca bakınız
- Başlarken
- Örnek: Veri Bağlarken Özel Durumları İşleme