Сбой приложения UWP Xamarin.Forms во время выполнения с собственной цепочкой инструментов .net, но работает иначе - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть приложение Xamarin.Forms UWP (Xamarin.Forms v3.4.0.1008975, UWP target / min версия 16299, VS 2017 15.9.11).При компиляции без цепочки инструментов .net он собирается и работает правильно.При компиляции с собственной цепочкой инструментов .net он работает нормально, но во время выполнения не работает.Это проблема, потому что я не могу выпустить приложение в магазин Windows.Это приложение ранее (~ 10 месяцев назад) было выпущено в магазин и работало правильно.С тех пор произошли значительные изменения в обновленных версиях пакетов XF, Prism, sqlite и добавлении пары других пакетов, среди многих других изменений, поэтому практически невозможно определить, какое изменение могло это вызвать.

Мне удалось преодолеть некоторые начальные проблемы с пакетами Rg.Plugins.Popup и Xam.Plugin.Iconize.FontAwesome, получив список сборок для них и передав их в Xamarin.Forms.Forms.Init(e, assemblies); в App.xaml.cs в проекте UWP.,Это исправлено проблемы с отображением всплывающих окон и значков шрифтов в моем приложении.

Когда приложение запускается, я вижу несколько обработанных FileNotFoundException при вызове Xamarin.Forms.Forms.Init(...) формы Cannot load assembly 'clrcompression'. No metadata found for this assembly..Недостающие сборки:

  • clrcompression
  • e_sqlite3
  • libEGL
  • libGLESv2
  • libSkiaSharp
  • SkiaSharp.Views.Interop.UWP
  • sqlite3

Как уже говорилось, эти ошибки обрабатываются и видны только при отладке.Я не видел каких-либо определенных доказательств того, что эти ошибки являются проблемой, поскольку приложение определенно считывает некоторые данные из Sqlite без ошибок, и я вижу изображения, нарисованные правильно с помощью SkiaSharp.

Однако при выполнении определенных действий, вызывающих сбой приложения, я получаю другие ошибки во время выполнения.Например Unhandled exception at 0x05F8F74C (SharedLibrary.dll) in MyApp.UWP.exe: 0x00001007. occurred.Если я загляну в окно тем, то получу немного больше информации:

Not Flagged >   13884   0   Worker Thread   <No Name>   
System.Private.SharedLibrary.Interop.Generated.dll!__Interop.api_ms_win_core_kernel32_legacy_l1_1_0_dll.PInvoke_RaiseFailFastException
System.Private.SharedLibrary.Interop.Generated.dll!__Interop.api_ms_win_core_kernel32_legacy_l1_1_0_dll.PInvoke_RaiseFailFastException(Interop._EXCEPTION_RECORD* pExceptionRecord, System.IntPtr pContextRecord, uint dwFlags)
System.Private.CoreLib.dll!Interop.mincore.PInvoke_RaiseFailFastException(Interop._EXCEPTION_RECORD* pExceptionRecord, System.IntPtr pContextRecord, uint dwFlags)
System.Private.CoreLib.dll!Interop.mincore.RaiseFailFastException(uint faultCode, System.IntPtr pExAddress, System.IntPtr pExContext) Line 122
System.Private.CoreLib.dll!System.RuntimeExceptionHelpers.FailFast(string message, System.Exception exception, System.RuntimeExceptionHelpers.RhFailFastReason reason, System.IntPtr pExAddress, System.IntPtr pExContext) Line 237
System.Private.CoreLib.dll!System.RuntimeExceptionHelpers.RuntimeFailFast(System.RuntimeExceptionHelpers.RhFailFastReason reason, System.Exception exception, System.IntPtr pExAddress, System.IntPtr pExContext) Line 200
[External Code]
System.Private.CoreLib.dll!Internal.Runtime.Augments.RuntimeAugments.RunFunctionWithConservativelyReportedBufferInternal<Internal.Runtime.TypeLoader.CallConversionParameters>(int cbBuffer, System.IntPtr pfnTargetToInvoke, ref Internal.Runtime.TypeLoader.CallConversionParameters context, ref System.Runtime.RuntimeImports.ConservativelyReportedRegionDesc regionDesc)
System.Private.CoreLib.dll!Internal.Runtime.Augments.RuntimeAugments.RunFunctionWithConservativelyReportedBuffer<Internal.Runtime.TypeLoader.CallConversionParameters>(int cbBuffer, System.IntPtr pfnTargetToInvoke, ref Internal.Runtime.TypeLoader.CallConversionParameters context)
System.Private.TypeLoader.dll!Internal.Runtime.TypeLoader.CallConverterThunk.CallConversionThunk(System.IntPtr callerTransitionBlockParam, System.IntPtr callConversionId)
[External Code]
Prism.dll!Prism.Mvvm.BindableBase.SetProperty<int?>(ref int? storage, int? value, string propertyName)
[External Code]
System.Private.CoreLib.dll!Internal.Runtime.Augments.RuntimeAugments.CallDescrWorker(System.IntPtr callDescr) Line 970
System.Private.TypeLoader.dll!Internal.Runtime.TypeLoader.CallConverterThunk.InvokeTarget(void* allocatedStackBuffer, ref Internal.Runtime.TypeLoader.CallConversionParameters conversionParams)
System.Private.CoreLib.dll!Internal.Runtime.Augments.RuntimeAugments.RunFunctionWithConservativelyReportedBufferInternal<Internal.Runtime.TypeLoader.CallConversionParameters>(int cbBuffer, System.IntPtr pfnTargetToInvoke, ref Internal.Runtime.TypeLoader.CallConversionParameters context, ref System.Runtime.RuntimeImports.ConservativelyReportedRegionDesc regionDesc)
System.Private.CoreLib.dll!Internal.Runtime.Augments.RuntimeAugments.RunFunctionWithConservativelyReportedBuffer<Internal.Runtime.TypeLoader.CallConversionParameters>(int cbBuffer, System.IntPtr pfnTargetToInvoke, ref Internal.Runtime.TypeLoader.CallConversionParameters context)
System.Private.TypeLoader.dll!Internal.Runtime.TypeLoader.CallConverterThunk.CallConversionThunk(System.IntPtr callerTransitionBlockParam, System.IntPtr callConversionId)
[External Code]
MyApp.dll!MyApp.ViewModels.AppLevel.AppStatusViewModel.CurrentSynchroniseJobTasksCount.set(int? value) Line 415
MyApp.dll!MyApp.ViewModels.AppLevel.AppStatusViewModel.HandleDataSyncStartEvent(string payload) Line 287
[External Code]
MyApp.dll!MyApp.Services.Synchronisation.DataSyncCoordinator.DoSynchronisationJob() Line 84
MyApp.dll!MyApp.Services.Synchronisation.DataSyncCoordinator.AttemptSynchronisationTask(MyApp.Services.Synchronisation.IDatabaseSyncJob job) Line 74
MyApp.dll!MyApp.Services.Synchronisation.DataSyncService.DeleteLocalData(string dbResetKey) Line 29
MyApp.dll!MyApp.ViewModels.ClearLocalDataPopupViewModel.Submit() Line 66
[Resuming Async Method]
[External Code]

К сожалению, хотя это говорит мне о том, где происходит проблема, она не дает мне никаких сведений о том, почему это происходит и как я могу это сделать.почини это.В этом случае кажется, что он не может установить свойство для модели представления, но даже для достижения этой точки в коде он должен был сделать это успешно в других местах.Я думаю, что я действительно ищу руководство о том, как исследовать это / получить больше информации, так как будет трудно решить конкретные проблемы без некоторого исходного кода (который я не могу действительно предоставить).Я попытался отладить с отключенной оптимизацией, которая часто предлагается, но она не предоставляет больше информации, чем я разместил здесь.

Я также беспокоюсь, что даже если я узнаю, почему происходит именно это исключение, иисправьте это, чтобы в приложении могло быть гораздо больше проблем, которые появляются только при использовании собственной цепочки инструментов .net.Могу ли я использовать какие-либо инструменты, чтобы помочь с этим?

1 Ответ

1 голос
/ 29 апреля 2019

Так что это оказалось проблемой с Prism (7.0.0.396) и .net native.Похоже, что свойства связывания с обнуляемым типом (int? в данном случае), использующие BindableBase.SetProperty, завершаются неудачно при компиляции с цепочкой собственных инструментов .net.Это исправляется следующим образом:

public class BindableBaseWithFix : BindableBase
{
    protected virtual bool SetProperty<T>(ref T? storage, T? value, [CallerMemberName] string propertyName = null)
        where T : struct
    {
        if (EqualityComparer<T?>.Default.Equals(storage, value))
            return false;
        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
} 
...