无法从 .Net 核心应用程序中的 GAC 加载 dll

Could not load dll from GAC in .NetCore Application

我的示例控制台应用程序(比如 App1)使用 .Net Core 3.1 开发,它调用另一个 .NetCore dll(比如 Dll1)。我添加了 "Copy Local = Yes" 作为参考 dll。我正在使用 Visual Studio 2019 作为开发环境。

在直接场景下效果很好。意思是,当我在 App1.

中设置 "Copy Local = Yes"

我已经在 GAC 中注册了 .Net Core dll (Dll1) 并在 App1 中设置了 "Copy Local = No"。

现在我无法加载 .Net Core (Dll1),它抛出了以下异常。

未处理的异常。 System.IO.FileNotFoundException: 无法加载文件或程序集 'xxxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66f432805192946d'。该系统找不到指定的文件。 文件名:'xxxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66f432805192946d' 在 xxxxx.Program.Main(字符串[] 参数)

我的疑惑:

.Net Core是否支持从GAC调用dll?

请帮我解决这个问题。

此致,

哈里

你的问题

.Net Core 是否从全局程序集缓存 (GAC) 加载程序集?

简短答案:

没有

长答案:

当你使用程序集时,如果设置了 CopyLocal = false,这意味着程序集(.dll 文件)不会被放置到你刚刚构建的任何文件的输出目录中。

在这里,.Net Core 的行为不同于 .Net Framework:

在 .Net Framework 中

一旦在执行代码中的某处使用了丢失的程序集,运行时环境就会尝试搜索、查找并加载它。对于 .Net Framework,这发生在一个非常具体的 way 中,包括在可用时从 GAC(全局程序集缓存)加载它。

dotnetcore 是这样做的:

那些 dotnetcore 应用程序设计为独立且易于处理,不想依赖它们的环境。您与他们一起提供他们需要知道的所有信息。因此,这些应用程序不会四处寻找丢失的 dll,也不会查看 GAC。这是正常的部署方法,称为“自包含部署”

然而,有一种叫做 runtime package store 的东西可以帮助优化你的部署,它通过定义你的 .Net Core 应用程序不是“自包含的”,而是针对定义的“框架( = 其中定义了一组库)。这称为 “依赖于框架的部署”

如果您需要有关 .Net Core 应用的框架依赖部署的更多信息

看看这个