0

tl;dr:我的 .NET Core 3.1 控制台应用程序因 a 崩溃,FileNotFoundException因为版本 A 中存在(引用?)程序集,但版本 B 中需要。怎么办?


我正在尝试运行一个控制台应用程序,该应用程序现在是为 .NET Core 3.1 构建的,但在转换之前它曾经是一个 .NET Framework 4.8 项目。

控制台应用程序崩溃并显示3.1.0.0System.IO.FileNotFoundException中的程序集Microsoft.Extensions.FileProviders.Physical无法找到。现在,我可以确认它不存在 - 在我的控制台应用程序文件所在的目录中,有一个名为Microsoft.Extensions.FileProviders.Physical.dll的文件,但它的程序集版本是3.1.6.0.exe

控制台应用程序及其依赖项是所述文件夹中更大项目的一部分,共有 1,200 多个 DLL。

在 .NET Framework 中,我会使用绑定重定向来使用指定程序集的当前版本 3.1.6.0。不过,在 .NET Core 中,我知道这些绑定重定向不再是一回事了。因此,我不确定如何继续,甚至如何找出运行时认为它需要加载Microsoft.Extensions.FileProviders.Physical.dll的原因。

我可能已经找到了一个加载版本不匹配的程序集的部分解决方案(参见下面的观察(6)),但是,我仍然得到一个FileNotFoundException,这次是Microsoft.AspNetCore.Mvc.Abstractions.

一些观察和尝试解决这个问题:

  • (1) > 1,200 个.csproj文件中没有一个包含字符串“Physical”。

  • (2) 400多个.deps.json文件中提到“Microsoft.Extensions.FileProviders.Physical.dll”,均指3.1.0.0版本。

  • (3) 所有相应的 DLL 都加载到 ASP.NET Core 应用程序中,其中版本不匹配似乎不会导致任何问题。

  • (4).deps.json我的控制台应用程序本身的文件没有提到“Microsoft.Extensions.FileProviders.Physical.dll”。

  • (5) 将文件的正确版本 (3.1.0.0) 放入.exe文件所在的目录以及.exe文件的执行位置不会改变任何内容。FileNotFoundException仍然发生,仍然抱怨缺少“Microsoft.Extensions.FileProviders.Physical.dll”,版本 3.1.0.0 。

  • (6) 根据CodeProject 文章中提供的.NET Core 中程序集解析的信息,我尝试自己从同一目录强制加载程序集(初步代码,依赖于工作目录):

    AssemblyLoadContext.Default.Resolving += (context, name) =>
    {
      var dllPath = System.IO.Path.Combine(Environment.CurrentDirectory, name.Name + ".dll");
    
      if (File.Exists(dllPath))
      {
        return AssemblyLoadContext.Default.LoadFromAssemblyPath(dllPath);
      }
    
      return null;
    };
    

    这似乎在一定程度上有所帮助!现在,可以加载“Microsoft.Extensions.FileProviders.Physical.dll”程序集和大量(超过 250 个)程序集。但是一旦需要加载“Microsoft.AspNetCore.Mvc.Abstractions”3.1.0.0,这就会失败,这实际上不在.exe文件周围的任何地方。显然,它必须从其他地方加载(?)

  • (7) 虽然上面似乎提供了关于版本不匹配的部分解决方案,但我们的整个源代码不包含其他出现的“AssemblyLoadContext”。因此,ASP.NET Core 应用程序显然使用其他一些机制避免了版本不匹配问题。

  • (8) 构建我的控制台应用程序并将构建输出设置为诊断1确认“Microsoft.Extensions.FileProviders.Physical.dll”文件的可疑行为(输出的缩短摘录):

    Dependency "Microsoft.Extensions.FileProviders.Physical, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60".
      Could not resolve this reference. Could not locate the assembly "Microsoft.Extensions.FileProviders.Physical, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
          For SearchPath "C:\(...)".
          Considered "C:\(...)\Microsoft.Extensions.FileProviders.Physical.winmd", but it didn't exist.
          Considered "C:\(...)\Microsoft.Extensions.FileProviders.Physical.dll",
              but its name "Microsoft.Extensions.FileProviders.Physical, Version=3.1.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"
              didn't match the expected name "Microsoft.Extensions.FileProviders.Physical, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60".
          Considered "C:\(...)\Microsoft.Extensions.FileProviders.Physical.exe", but it didn't exist.
      Required by "(A)".
      Required by "(B)".
      Required by "(C)".
    

    在那里,(A)、(B) 和 (C) 是我们自己项目的程序集。但据我所知,他们的两个.csproj文件都没有提到“物理”文本,所以我不明白为什么据称他们需要 DLL。

  • (9) 对于“Microsoft.AspNetCore.Mvc.Abstractions”程序集,诊断输出显示:

    Dependency "Microsoft.AspNetCore.Mvc.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60".
      Could not resolve this reference. Could not locate the assembly "Microsoft.AspNetCore.Mvc.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
          For SearchPath "C:\(...)".
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.winmd", but it didn't exist.
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.dll", but it didn't exist.
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.exe", but it didn't exist.
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.winmd", but it didn't exist.
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.dll", but it didn't exist.
          Considered "C:\(...)\Microsoft.AspNetCore.Mvc.Abstractions.exe", but it didn't exist.
      Required by "(B)".
    

    再一次,(B) 是我们自己的程序集(与 (8) 中的 (B) 相同),但查看.csproj文件并没有显示“Mvc.Abstractions”的单个出现。


我发现了几个似乎可以提供解决方案的问题,但没有一个对我有用:


如何使指定程序集的运行时加载版本为 3.1.6.0 而不是请求的版本 3.1.0.0?或者,我如何找出运行 ASP.NET Core 应用程序时运行时的工作方式?


1:在 VS2019 中:工具 -> 选项 -> 项目和解决方案 -> 构建并运行 -> MSBuild 项目构建输出详细程度 -> 诊断

4

0 回答 0