2

当我尝试使用文件接收器时,我收到了 MissingMethodException。

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day, shared: true)
                .CreateLogger();

这真的很奇怪,因为我以前用相同的设置使用过它,它从来没有出现任何问题,但我确定这是导致错误的原因,因为如果我去掉 .WriteTo.File() 行,我不会'得到错误。

这是我的packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ModPlus.Revit.API.2020" version="1.0.0" targetFramework="net472" />
  <package id="Serilog" version="2.9.0" targetFramework="net472" />
  <package id="Serilog.Sinks.File" version="4.1.0" targetFramework="net472" />
</packages>

你能想出发生这种情况的原因吗?
我见过类似的问题,通常是由于程序集文件中的版本不匹配,但我检查并引用了正确的版本(至少在我的packages.config中可以看到)

编辑: 这是完整的未处理异常 未处理的异常

编辑 2: 调用 Serilog 的代码是 Revit(3D 建模软件)的插件,我只是尝试在 2 个不同版本的平台中运行此插件:

  • Revit 2020,我得到了未处理的异常
  • Revit 2019,它工作正常!(我需要插件在两个版本上都可以工作)

两个版本的软件都使用同一个版本的.NET Framework, 4.7.2
这是否提供了更多线索?在一个版本中可能出了什么问题,而在另一个版本中却没有?

4

2 回答 2

1

此错误表明您以某种方式Serilog.Sinks.File.dll在输出文件夹中获得了旧版本,这不是您通过 NuGet 安装的版本。

打开您的.csproj文件并检查所有引用Serilog.Sinks.File.dll并确保您只有一个引用,并且它指向正确的 nuget 包文件夹(4.1.0)。

它应该看起来像:

  <ItemGroup>
    <Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
      <HintPath>..\packages\Serilog.2.9.0\lib\net46\Serilog.dll</HintPath>
    </Reference>
    <Reference Include="Serilog.Sinks.File, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
      <HintPath>..\packages\Serilog.Sinks.File.4.1.0\lib\net45\Serilog.Sinks.File.dll</HintPath>
    </Reference>
  </ItemGroup>

您还可以使用dotPeek之类的工具来检查输出文件夹中的程序集并确认您是否拥有正确的程序集。


此外,虽然我认为它与这个特定错误无关,但请确保您在项目属性中启用了自动生成绑定重定向,以便Serilog.Sinks.File对 Serilog 2.5.0 的引用重定向到 Serilog 2.9.0。

绑定重定向

于 2020-10-20T17:10:39.787 回答
1

现在您已经使用新信息更新了问题:

调用 Serilog 的代码是 Revit(3D 建模软件)的插件,我只是尝试在 2 个不同版本的平台上运行这个插件:

  • Revit 2020,我得到了未处理的异常
  • Revit 2019,它工作正常!

MissingMethodException表明Serilog.Sinks.File.dllAppDomain 中加载的内容没有扩展方法.WriteTo.File(path, rollingInterval, shared)

该方法是在Serilog.Sinks.File.dll v4.0.0中引入的,它告诉我 Revit 2000 正在加载旧版本Serilog.Sinks.File.dll(在该方法存在之前v3.2.0或更早版本)。

我可以想到发生这种情况的两种可能性:

  1. Revit 2000 本身使用SerilogandSerilog.Sinks.File进行日志记录,它使用的是旧版本的 sink

  2. 另一个插件(在你之前加载)使用SerilogSerilog.Sinks.File用于日志记录,他们使用旧版本的接收器


你可以尝试的事情:

  1. 找出正在加载的版本,并降级您的插件以使用该版本

  2. 找到从哪里Serilog.Sinks.File.dll加载旧版本(物理路径),并将其替换为您要在插件中使用的较新版本 - 并测试它不会破坏使用旧版本的任何人。如果你走这条路,你可能也想更换Serilog.dll以确保它是你想要的版本。

您可以使用Fuslogvw.exe(程序集绑定日志查看器)检查程序集的加载位置。

或者,您可以在插件加载时进行迭代AppDomain.CurrentDomain.GetAssemblies(),并检查CodeBase以查看加载的位置Serilog.Sinks.File.dll

注意:在常规应用程序中,答案是将绑定重定向添加到主机应用程序的配置文件中,但不幸的是,鉴于Serilog 程序集版本都锁定在 2.0.0.0 版本,因此无法进行绑定重定向,因此 .NET 可以'不要区分v4.0.0v3.2.0 nuget 包中的程序集...

PS:您可能想在Autodesk Revit 论坛上问这个问题。

于 2020-10-21T19:23:38.893 回答