【问题标题】:Could not load dll from GAC in .NetCore Application无法在 .Net Core 应用程序中从 GAC 加载 dll
【发布时间】:2020-07-16 07:16:54
【问题描述】:

我的示例控制台应用程序(例如 App1)使用 .Net Core 3.1 开发,它调用另一个 .NetCore dll(例如 Dll1)。我添加了“复制本地 = 是”作为参考 dll。我使用 Visual Studio 2019 作为开发环境。

它在直接场景中运行良好。意思是,当我在 App1 中设置“Copy Local = Yes”时。

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

现在我无法加载 .Net Core (Dll1) 并抛出异常。

未处理的异常。 System.IO.FileNotFoundException:无法加载文件或程序集“xxxxx,版本=1.0.0.0,文化=中性,PublicKeyToken=66f432805192946d”。该系统找不到指定的文件。 文件名:'xxxxx,版本=1.0.0.0,文化=中性,PublicKeyToken=66f432805192946d' 在 xxxxx.Program.Main(String[] args)

我的疑惑:

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

请帮我解决这个问题。

问候,

哈里

【问题讨论】:

  • .NET Core 没有 GAC 的概念
  • 首先尝试了解一下.net core和.net framework的区别

标签: c# visual-studio-2019 .net-core-3.1


【解决方案1】:

您的问题

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

简答:

没有

长答案:

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

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

在 .Net 框架中

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

这就是 dotnetcore 的做法:

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

但是,有一个叫做 runtime package store 的东西可以帮助优化您的部署,通过定义您的 .Net Core 应用程序不是“自包含”,而是针对定义的“框架(= 其中一个集合库被定义为存在)。这称为“框架依赖部署”

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

看看这个 Is there any GAC equivalent for .NET Core?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2019-08-21
    • 2020-06-17
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多