.net core 加载动态加载的程序集引用的Nuget包时FileNotFoundException
我正在将.NET Framework应用程序升级到.NET Core 3,遇到了一个问题: 我的应用程序有两个程序集,让我们称它们为.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(使用反射),除非
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。您可以了解有关编组行为的更多信息。