简体   繁体   English

MvvmCross Xamarin Android与SerilogLogProvider的链接问题

[英]MvvmCross Xamarin Android Linking Issue with SerilogLogProvider

Running into Linker issue again with MvvmCross in Xamarin Android. Xamarin Android中的MvvmCross再次遇到链接器问题。 Recently upgraded to MvvmCross 6.1.2 and started using Serilog. 最近升级到MvvmCross 6.1.2,并开始使用Serilog。 When compile in release mode with “Sdk and User Assemblies”, I got the following error from base.CreateLogProvider() during Android Setup: 当使用“ SDK和用户程序集”在发布模式下编译时,在Android安装过程中从base.CreateLogProvider()获得以下错误:

The CreateLogProvider() code: CreateLogProvider()代码:

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

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

        return base.CreateLogProvider();
    }

EXCEPTION: 例外:

    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 ---

With other linking issues, I usually try to access the function being stripped out in LinkerPleaseInclude. 对于其他链接问题,我通常尝试访问LinkerPleaseInclude中剥离的功能。 ie MvvmCross.Logging.LogProviders.SerilogLogProvider.GetForContextMethodCall() in this case. 即在这种情况下MvvmCross.Logging.LogProviders.SerilogLogProvider.GetForContextMethodCall()。 However, SerilogLogProvider is an internal class that I could not access. 但是,SerilogLogProvider是我无法访问的内部类。

The last thing I tried is to add Serilog and MvvmCross.Logging.LogProviders to “Skip linking assemblies”. 我尝试的最后一件事是将Serilog和MvvmCross.Logging.LogProviders添加到“跳过链接程序集”。 It does not work neither. 它也不起作用。

Thank you very much for your help in advance. 非常感谢您的提前帮助。

Regards, 问候,

Nick 缺口

The issue is that SerilogLogProvider uses reflection against Serilog.dll ( See GitHub SerilogLogProvider source ). 问题是, SerilogLogProvider使用对反射Serilog.dll见GitHub的SerilogLogProvider )。 Even if you had access to the SerilogLogProvider class it would not help in preventing the linker from stripping away the needed methods. 即使您有权访问SerilogLogProvider类,也无法防止链接程序剥夺所需的方法。 The reason being is that the linker is actually stripping the methods that you need from the Serilog.dll . 原因是链接器实际上正在从Serilog.dll剥离所需的方法。

You can add the following include to your LinkerPleaseInclude.cs to prevent the linker from stripping out the methods that SerilogLogProvider makes use of. 您可以将以下包含项添加到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