升级到 .NET 6 后,工作目录中的 dll 的程序集解析失败

问题描述 投票:0回答:1

我正在将程序从 .NET Framework 升级到 .NET 6,并偶然发现程序集加载问题。

该程序是基于插件的,插件 dll 驻留在主文件夹的子文件夹中(主文件夹是程序的工作目录)。 “核心”项目和外部依赖项位于主文件夹中。

主文件夹如下所示:

|-- Program.exe
|-- Utilities.dll
|-- ExternalDependency.dll
|-- plugins
    |-- Plugin.dll

这里,ExternalDependency.dll是Plugin.dll的依赖项。文件通过构建后脚本复制到此文件夹结构中。

启动 Program.exe 时,程序会加载“plugins”文件夹中的所有 dll。加载 Plugin.dll 时,程序无法找到ExternalDependency.dll。

我希望程序在当前工作目录中查找 dll。我已经确认工作目录确实是包含ExternalDependency.dll的目录。

如果我将ExternalDependency.dll 放在插件文件夹中,它确实可以正确加载。我不想这样做,因为在这种情况下我必须将所有内容都放在同一个文件夹中(核心项目、插件和外部依赖项),这会扰乱插件加载。

我也可以附上我自己的方法来解决组装:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

在这种情况下,我可以加载程序集,即使只是通过调用

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    return Assembly.LoadFrom(args.Name.Split(',')[0] + ".dll")
}

,我想,它只是在当前工作目录中查找。

即便如此,实现我自己的程序集解析逻辑以在工作目录中定位 dll 似乎并不正确。此方法似乎也与其他“失败”挂钩,特别是特定于区域设置的资源程序集,否则可能会通过其他一些后备机制成功。

这曾经在 .NET Framework 上工作,我无法想象为什么它不能在 .NET 6 上工作。当前工作目录不是寻找程序集的明显位置吗?是否有一些配置文件可以控制这个?我还漏掉了什么吗?

编辑:我应该注意到,大多数依赖项(其中几个遵循相同的位置模式)都已正确加载,因此这似乎只是一个实例的问题。

c# .net assemblies
1个回答
0
投票

这可能与 .NETCore 中的程序集探测更改有关。例如,

main_process.dll
在其子文件夹中有一个依赖 dll
externaldependency.dll

如果是这样,您可能需要在

additionalAssemblyPaths
 中添加 
main_process.runtimeconfig.json

"additionalAssemblyPaths" : [
      "subfolder_name"
    ],

然后在

main_process.deps.json

中添加路径
  "libraries": {
    "externaldependency": {
      "path": "."
    },

然后

main_process
可以在运行时在其子文件夹
externaldependency.dll
中找到
subfolder_name

© www.soinside.com 2019 - 2024. All rights reserved.