.net core 加载动态加载的程序集引用的Nuget包时FileNotFoundException

.net core 加载动态加载的程序集引用的Nuget包时FileNotFoundException,.net-core,.net Core,我正在将.NET Framework应用程序升级到.NET Core 3,遇到了一个问题: 我的应用程序有两个程序集,让我们称它们为Alpha(可执行文件)和Beta(库)。两者都是同一解决方案中的.NET核心3项目,但是Alpha没有直接引用Beta测试版引用了第三方Nuget软件包Charlie(一个.NET标准1.1库) Alpha使用Assembly.LoadFile(@“Path\To\Beta.dll”)动态加载Beta。这工作正常,Alpha能够成功地调用Beta(使用反射),除非

我正在将.NET Framework应用程序升级到.NET Core 3,遇到了一个问题:

我的应用程序有两个程序集,让我们称它们为
Alpha
(可执行文件)和
Beta
(库)。两者都是同一解决方案中的.NET核心3项目,但是
Alpha
没有直接引用
Beta
<代码>测试版引用了第三方Nuget软件包
Charlie
(一个.NET标准1.1库)

Alpha
使用
Assembly.LoadFile(@“Path\To\Beta.dll”)
动态加载
Beta
。这工作正常,
Alpha
能够成功地调用
Beta
(使用反射),除非它根据
Beta
的需要自动尝试加载
Charlie
程序集时抛出异常:

System.IO.FileNotFoundException: 'Could not load file or assembly 'Charlie, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXXXXXXXXXXXXX'. The system cannot find the file specified.'
这在.NETFramework中运行良好,但在.NETCore中似乎不起作用。
Beta
Charlie
都被复制到
Alpha
的输出文件夹中

添加
Beta
作为对
Alpha
的引用可以使它工作,但我不希望这样做,因为
Alpha
没有直接调用
Beta
中任何内容的业务(通过反射调用的两个定义良好的方法除外)


如何解决这个问题,而不添加
Beta
Charlie
作为
Alpha
的依赖项?

事实证明,如果我使用而不是
assembly.LoadFile
加载
Beta
程序集,那么它就可以工作,但我不明白为什么。如果有人能解释原因,我会很乐意接受并投票支持你的答案。

正如苏珊娜·库克(Suzanne Cook)在她的文章中解释的那样:

LoadFrom()经过融合,可以重定向到另一个 位于不同路径但具有相同标识(如果有)的程序集 已在LoadFrom上下文中加载

LoadFile()不绑定 通过融合-装载机只是继续前进,准确装载* 来电者要求的。它既不使用加载,也不使用 从上下文加载

因此,LoadFrom()通常会满足您的需求,但不会满足您的需求 当然LoadFile()是为那些真正想要 所要求的。(*但是,从v2开始,将应用策略 对于LoadFrom()LoadFile(),因此LoadFile()不一定是 正是请求的。另外,从v2开始,如果程序集 其身份在GAC中,将使用GAC副本。使用 ReflectionOnlyLoadFrom()加载您想要的内容-但是,请注意 无法执行以这种方式加载的程序集。)

LoadFile()有一个陷阱。因为它不使用绑定上下文,所以 在其目录中不会自动找到依赖项。如果他们 如果在加载上下文中不可用,则必须订阅 AssemblyResolve事件以绑定到它们


您可以找到适合您的绑定上下文。

谢谢!那么,为什么LoadFile在.NET Framework中工作而在.NET Core中不工作呢?如果将同一个类加载到两个单独的AssemblyLoadContext中,它们将被视为不同的类型。NET core不支持跨这些边界自动编组类型。在本例中,Assembly.LoadFile正在创建一个单独的AssemblyLoadContext。您可以了解有关编组行为的更多信息。