【问题标题】:Can a referenced DLL be loaded even if it's not called?即使没有调用引用的 DLL,也可以加载它吗?
【发布时间】:2009-10-01 12:35:45
【问题描述】:

环境:.NET / VS2008

大家好,

我的应用程序使用单独安装在某些系统(明确标识)但不是所有系统上的第 3 方 DLL 程序集。

这意味着在某些系统上,DLL 不存在因此不得调用。为了解决这个问题,我为 2 个用例提供了 2 个版本的应用程序(使用 2 个配置)。在其中之一中,对 DLL 的所有调用都被#if'ed out。

由于在应用程序中根本没有调用已编译的 DLL(它们被#if'ed out),是否可以安全地假设应用程序不会尝试加载 DLL,即使它被引用?

或者我也应该排除引用?

注意:针对 womp 在this question 中的评论进行提问。

TIA,

【问题讨论】:

    标签: c# .net clr


    【解决方案1】:

    IIRC,C# 编译器将省略对代码中从未实际使用过的 dll 的引用。因此,如果所有代码都在 #ifs 中,则对 dll 的引用将不会出现在您编译的应用程序中,并且永远不会加载 dll。

    顺便说一句,您可以使用 Reflector 进行检查。只需将已编译的应用拖放到 Reflector 中,然后查看 References 节点。我认为 ILDASM 也提供了这个功能。

    警告:DllImports 和动态类型加载(例如,Type.GetType("type,dll"))将在 C# 编译器不知道或不关心的情况下动态加载 dll。但同样,如果在正确的 #ifs 内,则不会加载任何内容。

    【讨论】:

      【解决方案2】:

      我会排除它。无论如何它都可能会加载它,如果您有类型引用,那么这也可能导致问题。

      【讨论】:

        【解决方案3】:

        如果需要/可用,为什么不动态加载程序集?然后,如果以后添加它,您可以使用它吗?您也只需要一个版本的应用。

        【讨论】:

        • 这就是我最终要做的。该案例发生在紧急支持电话中。
        【解决方案4】:

        如果您从不(显然)实例化和引用的类并且从不在任何实例化或引用的对象中引用该类,那么您使用引用是安全的,但没有实际的 DLL。

        通常,您的 DLL 将在引用类的类构造函数第一次运行时加载。

        HTH 一月

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2015-08-10
        • 2017-06-07
        相关资源
        最近更新 更多