【问题标题】:loading an assembly from GAC从 GAC 加载程序集
【发布时间】:2019-07-23 11:09:10
【问题描述】:

我目前正在开发一个需要使用自定义 dll 进行身份验证的项目。 这个 dll 在生产和测试环境的 GAC 中注册(他们告诉我)。 公司政策规定您“不应在应用程序的 web.config 文件中包含 dll 引用”,也就是说,您不应该有类似的内容:

等等

在您的 web.config 中,至少对于我正在谈论的这个 dll。他们说,由于它已在 GAC 中注册,因此应用程序无论如何都会加载它。 问题是,如果您不在您的 web .config 中添加程序集引用,则无论他们说什么,应用程序都不会找到它。

既然我确定 dll 确实在 GAC 中注册,我的问题是:

不管你是否在web.config中添加引用,应用程序是否应该能够加载dll? 我确信,添加对项目的引用, dll 的 GAC 位置将存储在应用程序的程序集中,这样应用程序本身就能够在 GAC 中找到程序集,无论工作系统是什么,给定该 dll 实际上已在工作系统的 GAC 中注册。 但我一定是错的。 它的真正运作方式是什么?

谢谢

狮子座

我尝试从 web.config 中删除该条目:每次在我的测试环境中引用 dll 中的方法时,都会出现运行时错误;同样的事情发生在生产环境中;

【问题讨论】:

    标签: c# web-config .net-assembly gac


    【解决方案1】:

    不管你是否在web.config中添加引用,应用程序是否应该能够加载dll?

    逻辑应用程序在启动时会在 GAC 中加载 每个 程序集,您能想象这会有多慢吗?不,这不是它的工作原理。

    当您在项目中本地引用 DLL 时,您所做的就是将其添加到清单中,这会告诉应用程序将其作为应用程序的一部分加载。当 CLR 加载时,它首先会检查 GAC 中是否存在 DLL 的等效版本,如果存在则加载该版本,否则将尝试加载本地版本。

    How the Runtime Locates Assemblies

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题,James,
    • 我在您发送的链接上阅读了这篇文章,非常有趣,但有些事情让我感到困惑。它说(第 1 步:检查配置文件 | 机器配置文件):“机器配置文件中的设置优先于所有其他配置设置;”不就是反过来吗?据我所知,web.config(即应用程序本地)设置应优先于 machine.config(由本地计算机上的每个应用程序继承)。我错过了什么重要的东西吗?
    • @BoojiBoy 我不这么认为,我想说你的假设是正确的。 Machine.config 实际上是“主”配置,web.config 可用于覆盖这些设置。但是,这是指装配位置分辨率,而不是一般设置。
    • 实际上问题似乎出在以下配置标签中: if I删除它,会发生运行时错误。这个标签似乎与编译有关:当我在项目中添加对程序集的引用时,编译器是否意识到有一个程序集需要静态绑定,以便它可以使用标准程序查找它是否足够?
    • @BoojiBoy 您是从<compilation> 部分中删除 本地项目还是所有 条目? <compilation> 通常包含对您的网站运行所需的 GAC 相关 DLL 的引用,如果您只是将它们全部删除,那么是的,我希望它会失败。有很多关于web.config 工作原理以及每个部分的作用的材料,如果您想了解它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2011-01-27
    • 1970-01-01
    • 2014-10-14
    • 2011-04-05
    相关资源
    最近更新 更多