Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieses Thema bezieht sich auf die .NET Native Developer Preview, die Vorabversionssoftware ist. Sie können die Vorschau von der Microsoft Connect-Website herunterladen (erfordert Registrierung).
Nicht alle Metadaten-Nachschlagefehler in Apps, die mit der .NET Native-Toolkette entwickelt wurden, führen zu einer Ausnahme. Einige können auf unvorhersehbare Weise in einer App auftreten. Das folgende Beispiel zeigt eine Zugriffsverletzung, die durch Verweisen auf ein NULL-Objekt verursacht wird:
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]
Versuchen wir, diese Ausnahme zu beheben, indem wir den dreistufigen Ansatz verwenden, der im Abschnitt "Manuelles Auflösen fehlender Metadaten" von Erste Schrittebeschrieben wird.
Was hat die App getan?
Als Erstes ist die async Schlüsselwortmaschinen auf der Basis des Stapels zu beachten. Die Ermittlung, was die App in einer async-Methode tatsächlich macht, kann problematisch sein, da der Stack den Kontext des ursprünglichen Aufrufs verloren hat und den async-Code in einem anderen Thread ausgeführt hat. Wir können jedoch ableiten, dass die App versucht, die erste Seite zu laden. In der Implementierung für NavigationArgs.Setupverursachte der folgende Code die Zugriffsverletzung:
AppViewModel.Current.LayoutVM.PageMap
In diesem Fall war die LayoutVM-Eigenschaft an AppViewModel.Currentnull. Einige fehlende Metadaten verursachten einen subtilen Verhaltensunterschied und führten dazu, dass eine Eigenschaft nicht initialisiert wurde, wie es die App erwartet hatte. Das Setzen eines Haltepunkts im Code, an dem LayoutVM initialisiert werden sollte, könnte Klarheit über die Situation verschaffen. Beachten Sie jedoch, dass LayoutVMTyp App.Core.ViewModels.Layout.LayoutApplicationVMist. Die einzige Metadatendirektive, die bisher in der datei rd.xml vorhanden ist:
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
Ein wahrscheinlicher Grund für den Fehler ist, dass App.Core.ViewModels.Layout.LayoutApplicationVM Metadaten fehlen, da er sich in einem anderen Namespace befindet.
In diesem Fall wurde das Problem durch Hinzufügen einer Laufzeitdirektive für App.Core.ViewModels behoben. Die Ursache war ein API-Aufruf der Type.GetType(String)-Methode, der nullzurückgegeben hat. Die App ignorierte das Problem lautlos, bis ein Absturz aufgetreten ist.
Bei der dynamischen Programmierung ist es eine gute Praxis, unter .NET Native die Reflection-APIs zu verwenden und die Type.GetType-Überladungen zu nutzen, die beim Scheitern eine Ausnahme werfen.
Ist dies ein Isolierter Fall?
Andere Probleme können auch auftreten, wenn man App.Core.ViewModelsverwendet. Sie müssen entscheiden, ob es sich lohnt, jede fehlende Metadatenausnahme zu identifizieren und zu beheben oder Zeit zu sparen und Direktiven für eine größere Klasse von Typen hinzuzufügen. Hier ist das Hinzufügen von dynamic Metadaten für App.Core.ViewModels der beste Ansatz, wenn die resultierende Größenerhöhung der Ausgabebinärdatei kein Problem ist.
Könnte der Code neu geschrieben werden?
Wenn die App typeof(LayoutApplicationVM) anstelle von Type.GetType("LayoutApplicationVM")verwendet hätte, hätte die Toolkette browse Metadaten beibehalten können. Es wären jedoch immer noch keine invoke Metadaten erstellt worden, was beim Instanziieren des Typs zu einer MissingMetadataException Ausnahme geführt hätte. Um die Ausnahme zu verhindern, müssten Sie dennoch eine Laufzeitdirektive für den Namespace oder den Typ hinzufügen, der die dynamic-Richtlinie angibt. Informationen zu Laufzeitdirektiven finden Sie in der Laufzeit-Direktiven (rd.xml) Konfigurationsdatei-Referenz.