Compartir a través de


Ejemplo: Solución de problemas de programación dinámica

Nota:

En este tema se hace referencia a .NET Native Developer Preview, que es software de versión preliminar. Puede descargar la versión preliminar del sitio web de microsoft Connect (requiere registro).

No todos los errores de búsqueda de metadatos en las aplicaciones desarrolladas mediante la cadena de herramientas nativas de .NET producen una excepción. Algunos pueden manifestarse de maneras impredecibles en una aplicación. En el ejemplo siguiente se muestra una infracción de acceso causada por hacer referencia a un objeto NULL:

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]

Vamos a intentar solucionar esta excepción mediante el enfoque de tres pasos descrito en la sección "Resolver manualmente los metadatos que faltan" de Introducción.

¿Qué hacía la aplicación?

Lo primero que hay que tener en cuenta es el mecanismo de palabras clave async en la base de la pila. Determinar lo que realmente hacía la aplicación en un async método puede ser problemático, ya que la pila ha perdido el contexto de la llamada de origen y ha ejecutado el async código en un subproceso diferente. Sin embargo, podemos deducir que la aplicación está intentando cargar su primera página. En la implementación de NavigationArgs.Setup, el código siguiente provocó la violación de acceso.

AppViewModel.Current.LayoutVM.PageMap

En este caso, la propiedad LayoutVM de AppViewModel.Current era nulo. Algunas ausencias de metadatos provocaron una diferencia de comportamiento sutil y provocaron que una propiedad no inicializara en lugar de establecerse, como se esperaba en la aplicación. Establecer un punto de interrupción en el código donde LayoutVM se debe inicializar podría producir luz sobre la situación. Sin embargo, tenga en cuenta que el tipo de LayoutVMes App.Core.ViewModels.Layout.LayoutApplicationVM. La única directiva de metadatos presente hasta ahora en el archivo rd.xml es:

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

Una causa probable del fallo es que a App.Core.ViewModels.Layout.LayoutApplicationVM le falta metadatos porque está en un espacio de nombres diferente.

En este caso, al agregar una directiva en tiempo de ejecución para App.Core.ViewModels se resolvió el problema. La causa principal era una llamada API al Type.GetType(String) método que devolvía null y la aplicación omitió silenciosamente el problema hasta que se produjo un bloqueo.

En la programación dinámica, una buena práctica al utilizar las API de reflexión en .NET Native es emplear las sobrecargas de Type.GetType que lanzan una excepción en caso de fallo.

¿Este es un caso aislado?

También pueden surgir otros problemas al usar App.Core.ViewModels. Debe decidir si merece la pena identificar y corregir cada excepción de metadatos que faltan, o bien ahorrar tiempo y agregar directivas para una clase de tipos más grande. Aquí, agregar metadatos dynamic para App.Core.ViewModels podría ser el mejor enfoque si no es un problema el aumento de tamaño del binario resultante.

¿Podría volver a escribirse el código?

Si la aplicación hubiera usado typeof(LayoutApplicationVM) en lugar de Type.GetType("LayoutApplicationVM"), la cadena de herramientas podría haber mantenido los metadatos de browse. Sin embargo, todavía no habría creado invoke metadatos, lo que habría llevado a una MissingMetadataException excepción al crear una instancia del tipo. Para evitar la excepción, usted todavía tendría que agregar una directiva de tiempo de ejecución para el espacio de nombres o el tipo que especifica la política dynamic. Para obtener información sobre las directivas en tiempo de ejecución, consulte Directivas en tiempo de ejecución (rd.xml) Referencia de archivo de configuración.

Consulte también