次の方法で共有


例: データのバインド時の例外の処理

次の例は、.NET ネイティブ ツール チェーンを使用してコンパイルされたアプリがデータをバインドしようとしたときにスローされる MissingMetadataException エクセプションを解決する方法を示しています。 例外情報を次に示します。

This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM

関連付けられている呼び出し履歴は以下の通りです。

Reflection::Execution::ReflectionDomainSetupImplementation.CreateNonInvokabilityException+0x238
Reflection::Core::ReflectionDomain.CreateNonInvokabilityException+0x2e
Reflection::Core::Execution::ExecutionEnvironment.+0x316
System::Reflection::Runtime::PropertyInfos::RuntimePropertyInfo.GetValue+0x1cb
System::Reflection::PropertyInfo.GetValue+0x22
System::Runtime::InteropServices::WindowsRuntime::CustomPropertyImpl.GetValue+0x42
App!$66_Interop::McgNative.Func_IInspectable_IInspectable+0x158
App!$66_Interop::McgNative::__vtable_Windows_UI_Xaml_Data__ICustomProperty.GetValue__STUB+0x46
Windows_UI_Xaml!DirectUI::PropertyProviderPropertyAccess::GetValue+0x3f
Windows_UI_Xaml!DirectUI::PropertyAccessPathStep::GetValue+0x31
Windows_UI_Xaml!DirectUI::PropertyPathListener::ConnectPathStep+0x113

アプリは何をしていましたか?

スタックのベースでは、 Windows.UI.Xaml 名前空間のフレームは、XAML レンダリング エンジンが実行されていたことを示します。 PropertyInfo.GetValue メソッドの使用は、メタデータが削除された型に対するプロパティの値のリフレクション ベースの検索を示します。

メタデータ ディレクティブを提供する最初の手順は、型 serialize メタデータを追加して、そのプロパティがすべてアクセスできるようにすることです。

<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />

これは分離されたケースですか?

このシナリオでは、データ バインディングに 1 つの ViewModelの不完全なメタデータがある場合は、他のにも含まれる可能性があります。 アプリのビュー モデルがすべて App.ViewModels 名前空間にあるようにコードが構造化されている場合は、より一般的なランタイム ディレクティブを使用できます。

<Namespace Name="App.ViewModels " Serialize="Required Public" />

リフレクションを使用しないようにコードを書き直すことができるでしょうか。

データ バインディングはリフレクションを集中的に行うため、リフレクションを回避するためにコードを変更することはできません。

ただし、ツール チェーンがコンパイル時にプロパティ バインドを正しい型に関連付け、ランタイム ディレクティブを使用せずにメタデータを保持できるように、XAML ページに ViewModel を指定する方法があります。 たとえば、プロパティに Windows.UI.Xaml.Data.BindableAttribute 属性を適用できます。 これにより、XAML コンパイラは必要な参照情報を生成し、Default.rd.xml ファイルでランタイム ディレクティブを必要としないようにします。

こちらも参照ください