【问题标题】:A problem regarding dll inheritance关于dll继承的问题
【发布时间】:2010-04-22 00:34:09
【问题描述】:

我创建了一个可供多个应用程序使用的 dll,并创建了一个安装程序包,将其安装到程序文件中,并将其添加到全局程序集缓存中。

dll 本身使用 log4net,并且需要一个用于日志定义的 xml 文件。

因此,当安装程序运行时,以下文件会被复制到程序文件中的安装目录中: 我开发的主要dll - Log4Net.dll - Log4Net.xml 文件

我现在遇到了一个问题。我为实验创建了一个测试控制台应用程序。我已添加我的 dll 作为参考,并将“本地副本”标志设置为 false。

但是,当我编译测试控制台 exe 时,我注意到它已将 log4net.dll 和 log4net.xml 文件复制到 bin 目录中。并且在运行测试控制台时,它似乎只有在 log4net.dll 与 exe 位于同一目录中时才会起作用。尽管测试控制台应用程序不使用 log4net,但只有作为参考添加的 dll 使用。

有没有办法让所使用的 log4net.dll 和 xml 文件成为安装到程序文件中的文件,而不是复制本地副本所需的任何应用程序?将使用我的 dll 的应用程序不会使用 log4net,只有它们引用的 dll 使用它。

非常感谢

【问题讨论】:

    标签: c# inheritance dll


    【解决方案1】:
    1. 不要安装到全局程序集缓存中!即使您的库 dll 被多个应用程序使用,每个应用程序都应该有自己的本地副本。否则你会因为节省几 KB 的磁盘空间而陷入痛苦的世界。
    2. 始终在本地复制所需的 dll。如果您确实确定应用程序不需要它,您可以稍后简单地删除不必要的 dll 或不将它们包含在安装程序中。但是,如果您的应用程序将在那里调用任何引用,它将在运行时崩溃。所以最好的选择是将它们留在那里(毕竟它们被引用是有原因的)。
    3. 不,不可能(至少不费吹灰之力)从磁盘上的任意位置加载 .Net dll。应该是这样的(如果您想知道原因,请查找 DLL-hell)。

    【讨论】:

    • 不幸的是,不能依赖任何 dll 的本地副本 - 这是由于项目的要求,因为客户希望他们可以运行独立的 exe。这就是我将我的 dll 添加到 GAC 的原因。
    • 那是猪身上的口红。它不是一个独立的 exe,它需要 GAC 中的程序集和配置它的某个 xml 文件。拥有“独立 exe”的唯一一点是不需要安装程序。那是一头不会飞的猪。
    • 它需要独立到能够从主机上的任何目录运行的程度。客户想要一个干净的目录,里面装满了他们可以运行的 exe,而不是一个装满 exe 和支持 DLL/xml 文件的目录。实际上,我几乎可以通过简单地将 log4net.dll 添加到 GAC 来使其正常工作,但现在我遇到了一个问题,即它没有拾取 xml 文件。然而,这是向前迈出的一步。我同意你的想法,它可能不是最好的解决方案,但不幸的是它不是我的设计,而且我仅限于我们客户想要的框架。非常感谢
    • 恕我直言,因为客户的要求不是特别明智,所以创建错误的应用程序。以我的经验,实际上向客户暗示依赖“目录”中没有其他文件的 .exe 文件并不是一个特别好的要求(如果它不需要安装程序,我可以以某种方式理解它,但是它确实)。您可以使用链接器,但这并不能解决您的 xml 文件问题。
    【解决方案2】:

    我怀疑你的问题是配置。如果您希望它在 GAC 中工作,您必须使用完全限定名称。根据http://logging.apache.org/log4net/release/faq.html 的文档:

    “从 GAC 加载程序集时,必须指定完全限定的程序集名称,包括版本、文化和公钥。这是 System.Type.GetType 支持的标准语法。请参阅下一个常见问题解答以了解如何获取程序集的版本和公钥。”

    【讨论】:

    • 感谢您的更新,但我对如何更改附加程序感到困惑。这是我的 appender 标签: 然后我用 appender-ref 引用它。即: 在任何时候我都没有真正使用 GAC 中的类的名称。
    • 我刚刚提取了文档中的内容。它说如果你把 log4net 放在 GAC 中,你必须在配置中使用全名。我确实知道,如果您通过反射创建对象实例,除非您的类型名称包含版本和公钥,否则您无法在 GAC 之外创建实例。
    【解决方案3】:

    我也设法通过将 Log4net.dll 添加到 GAC 来解决此问题。它现在无需本地复制 dll 即可运行。

    但是,它确实需要 XML 文件的本地副本才能正确记录。

    【讨论】:

      猜你喜欢
      • 2012-10-20
      • 1970-01-01
      • 2011-08-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多