【问题标题】:MvvmCross Xamarin Android Linking Issue with SerilogLogProviderMvvmCross Xamarin Android 与 SerilogLogProvider 的链接问题
【发布时间】:2018-09-11 10:52:04
【问题描述】:

在 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 添加到“跳过链接程序集”。它也不起作用。

非常感谢您提前提供的帮助。

问候,

尼克

【问题讨论】:

    标签: c# android xamarin.android mvvmcross


    【解决方案1】:

    问题在于SerilogLogProviderSerilog.dll (See GitHub SerilogLogProvider source) 使用反射。即使您可以访问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]);
    }
    

    【讨论】:

    • 这非常有效。我永远无法自己修复它。非常感谢。
    • 修复此问题后,又遇到了一个完全没有线索的链接问题。链接太复杂了。希望有人可以在那篇文章中帮助我:(
    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多