2017-01-26 2 views
0

Приложение Xamarin.Forms продолжает сбой при открытии определенной страницы. Авария воспроизводится, но только в режиме деблокирования. Когда я создаю и запускаю приложение в режиме отладки, открывается одна и та же страница.Сбой приложения Xamarin.Forms с FileNotFoundException в InitializeComponent

С некоторым усилием мне удалось поймать исключение и отобразить трассировку стека в окне сообщения до закрытия приложения. Ошибка ядра кажется FileNotFoundException для System.Runtime сборки где-то в XamlParser из XamlLoader, который работает, когда моя страница вызывает InitializeComponent метод:

System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime' or one of its dependencies 
File name: 'System.Runtime' 
    at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) 
    at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) 
    at (wrapper remoting-invoke-with-check) System.AppDomain:Load (System.Reflection.AssemblyName) 
    at System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) 
    at Xamarin.Forms.Xaml.XamlParser.GetElementType (Xamarin.Forms.Xaml.XmlType xmlType, IXmlLineInfo xmlInfo, System.Reflection.Assembly currentAssembly, Xamarin.Forms.Xaml.XamlParseException& exception) 
    at Xamarin.Forms.Xaml.CreateValuesVisitor.Visit (Xamarin.Forms.Xaml.ElementNode node, INode parentNode) 
    at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) 
    at Xamarin.Forms.Xaml.RootNode.Accept (IXamlNodeVisitor visitor, INode parentNode) 
    at Xamarin.Forms.Xaml.XamlLoader.Visit (Xamarin.Forms.Xaml.RootNode rootnode, Xamarin.Forms.Xaml.HydratationContext visitorContext) 
    at Xamarin.Forms.Xaml.XamlLoader.Load (System.Object view, System.String xaml) 
    at Xamarin.Forms.Xaml.XamlLoader.Load (System.Object view, System.Type callingType) 
    at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[TXaml] (Xamarin.Forms.Xaml.TXaml view, System.Type callingType) 
    at MyApp.MyNamespace.Pages.MyPage.InitializeComponent() 
    at MyApp.MyNamespace.Pages.MyPage..ctor() 

ответ

2

Мой код имеет много System.Runtime связанных импорта, но трассировки стека что проблема, которая будет находиться в XAML, позволила мне найти реальную проблему.

Проблема была общим видом на этой странице, где аргумент типа был «system: String».

Resharper автоматического завершение этого к импорту System.Runtime сборки:

<mp:MyPage x:Class="MyApp.MyNamespace.Pages.MyPage" 
      xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:mc="clr-namespace:MyApp.MyNamespace.Controls;assembly=MyApp" 
      xmlns:mp="clr-namespace:MyApp.MyNamespace.Pages;assembly=MyApp" 
      xmlns:system="clr-namespace:System;assembly=System.Runtime"> 
    <!-- ... --> 
    <mc:MyControl x:TypeArguments="system:String" /> 
    <!-- ... --> 
</mp:MyPage> 

В то время как это работает в режиме отладки по какой-то причине, в режиме выпуска, что декларация вызывает приложение к сбою с указанной ошибкой, когда вы создайте страницу. Когда я изменил сборку mscorlib, приложение работает в Debug и режиме выпуска:

<mp:MyPage x:Class="MyApp.MyNamespace.Pages.MyPage" 
      xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:mc="clr-namespace:MyApp.MyNamespace.Controls;assembly=MyApp" 
      xmlns:mp="clr-namespace:MyApp.MyNamespace.Pages;assembly=MyApp" 
      xmlns:system="clr-namespace:System;assembly=mscorlib"> 
    <!-- ... --> 
    <mc:MyControl x:TypeArguments="system:String" /> 
    <!-- ... --> 
</mp:MyPage>