簡體   English   中英

MvvmCross Xamarin Android與SerilogLogProvider的鏈接問題

[英]MvvmCross Xamarin Android Linking Issue with SerilogLogProvider

Xamarin Android中的MvvmCross再次遇到鏈接器問題。 最近升級到MvvmCross 6.1.2,並開始使用Serilog。 當使用“ SDK和用戶程序集”在發布模式下編譯時,在Android安裝過程中從base.CreateLogProvider()獲得以下錯誤:

CreateLogProvider()代碼:

    public override MvxLogProviderType GetDefaultLogProviderType()
        => MvxLogProviderType.Serilog;

    protected override IMvxLogProvider CreateLogProvider()
    {
        Serilog.Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Error()
            .WriteTo.AndroidLog()
            .CreateLogger();

        return base.CreateLogProvider();
    }

例外:

    System.Exception: HandleAndroidException ---> System.ArgumentNullException: Value cannot be null.
    Parameter name: method
      at System.Linq.Expressions.Expression.Call(System.Linq.Expressions.Expression instance, System.Reflection.MethodInfo method, System.Linq.Expressions.Expression arg0, System.Linq.Expressions.Expression arg1, System.Linq.Expressions.Expression arg2)[0x0009d] in <c674d6912966428cb26998a802347469>:0 
      at System.Linq.Expressions.Expression.Call(System.Linq.Expressions.Expression instance, System.Reflection.MethodInfo method, System.Collections.Generic.IEnumerable`1[T] arguments) [0x00074] in <c674d6912966428cb26998a802347469>:0 
      at System.Linq.Expressions.Expression.Call(System.Linq.Expressions.Expression instance, System.Reflection.MethodInfo method, System.Linq.Expressions.Expression[] arguments) [0x00000] in <c674d6912966428cb26998a802347469>:0 
      at MvvmCross.Logging.LogProviders.SerilogLogProvider.GetForContextMethodCall() [0x00086] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Logging.LogProviders.SerilogLogProvider..ctor() [0x00018] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Core.MvxSetup.CreateLogProvider() [0x00045] in <df54a54dac96467098c3a9eece96a79b>:0 
      at myRouteTracker.Droid.Setup.CreateLogProvider() [0x0002a] in <bdd41c7f90344b17a5e6bc21c3959feb>:0 
      at MvvmCross.Core.MvxSetup.InitializeLoggingServices() [0x00000] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Core.MvxSetup.InitializePrimary() [0x00016] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Core.MvxSetupSingleton.StartSetupInitialization() [0x0000a] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Core.MvxSetupSingleton.InitializeAndMonitor(MvvmCross.Core.IMvxSetupMonitor setupMonitor) [0x00042] in <df54a54dac96467098c3a9eece96a79b>:0 
      at MvvmCross.Droid.Support.V7.AppCompat.MvxSplashScreenAppCompatActivity.OnCreate(Android.OS.Bundle bundle) [0x00019] in <2d476ccd46884988a021d78ffc7a2843>:0 
      at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <1b4c73c9a2864ea8b5827f31fda08c32>:0 
      at(wrapper dynamic-method) System.Object.e043741f-fba6-4072-a6c2-cfc97949a294(intptr, intptr, intptr)
       --- End of inner exception stack trace ---

對於其他鏈接問題,我通常嘗試訪問LinkerPleaseInclude中剝離的功能。 即在這種情況下MvvmCross.Logging.LogProviders.SerilogLogProvider.GetForContextMethodCall()。 但是,SerilogLogProvider是我無法訪問的內部類。

我嘗試的最后一件事是將Serilog和MvvmCross.Logging.LogProviders添加到“跳過鏈接程序集”。 它也不起作用。

非常感謝您的提前幫助。

問候,

缺口

問題是, SerilogLogProvider使用對反射Serilog.dll見GitHub的SerilogLogProvider )。 即使您有權訪問SerilogLogProvider類,也無法防止鏈接程序剝奪所需的方法。 原因是鏈接器實際上正在從Serilog.dll剝離所需的方法。

您可以將以下包含項添加到LinkerPleaseInclude.cs以防止鏈接器剝離SerilogLogProvider使用的方法。

public void Include(Serilog.ILogger logger)
{
    Serilog.Events.LogEventLevel logEventLevel = Serilog.Events.LogEventLevel.Debug;

    _ = Serilog.Log.ForContext("", "", false);
    _ = Serilog.Context.LogContext.PushProperty("", "", false);
    _ = !logger.IsEnabled(logEventLevel);
    logger.Write(logEventLevel, "", new object[0]);
    logger.Write(logEventLevel, new Exception(), "", new object[0]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM