MvvmCross Xamarin Android与SerilogLogProvider的链接问题

时间:2018-09-11 10:52:04

标签: c# android xamarin.android mvvmcross

在Xamarin Android中,MvvmCross再次遇到链接器问题。最近升级到MvvmCross 6.1.2,并开始使用Serilog。当使用“ SDK和用户程序集”在发布模式下进行编译时,在Android安装过程中从base.CreateLogProvider()获得以下错误:

CreateLogProvider()代码:

*::-ms-backdrop, .ui-widget {
    font-family: "Segoe UI", "Roboto", "Trebuchet MS", Arial, Helvetica, sans-serif;
 }

例外:

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

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

        return base.CreateLogProvider();
    }

对于其他链接问题,我通常尝试访问LinkerPleaseInclude中剥离的功能。即在这种情况下为MvvmCross.Logging.LogProviders.SerilogLogProvider.GetForContextMethodCall()。但是,SerilogLogProvider是我无法访问的内部类。

我尝试的最后一件事是将Serilog和MvvmCross.Logging.LogProviders添加到“跳过链接程序集”。它也不起作用。

非常感谢您的提前帮助。

此致

尼克

1 个答案:

答案 0 :(得分:4)

问题是SerilogLogProviderSerilog.dllSee 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]);
}