2010-04-22 70 views
1

我创建了一个将被多个应用程序使用的dll,并创建了一个安装程序包,将其安装到程序文件中,并将其添加到全局程序集缓存中。关于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使用它。

非常感谢

回答

2
  1. 不要安装到全局程序集缓存!即使你的图书馆的DLL由多个应用程序使用,每个应该有它自己的本地副本。否则,你将陷入一个痛苦的世界,以节省几KB的磁盘空间。
  2. 始终在本地复制所需的dll。如果您确定应用程序不需要它,您可以稍后删除unnessesary dll,或者不要将它们包含在安装程序中。但是如果你的应用程序会调用任何引用,那么它将在运行时崩溃。所以最好的选择是把它们留在那里(毕竟它们是由于某个原因而引用的)。
  3. 不,这是不可能的(至少不是没有太大的影响)从磁盘上的任意位置.Net加载dll。它应该是这样的(如果你想知道为什么,查找DLL地狱)。
+0

不幸的是,必须依赖任何dll的本地副本不是一个选项 - 这是由于项目的需求,因为客户希望独立的exe可以运行。这就是为什么我已将我的dll添加到GAC。 – Adam 2010-04-22 01:08:49

+1

这是一只猪的口红。它不是*独立的exe文件,它需要GAC中的程序集和某个配置它的xml文件。拥有“独立EXE”的唯一要求不需要安装程序。那是一头不会飞的猪。 – 2010-04-22 01:32:42

+0

它需要独立运行,以便能够从主机上的任何目录运行。客户端需要一个干净的目录,里面装满了可以运行的exe文件,而不是一个充满exe的目录,并支持DLL的/ xml文件。 实际上,我几乎可以通过将log4net.dll添加到GAC中,除了现在我遇到了一个不拾取xml文件的问题。但是,这是一个进步。 我同意你的看法,认为它可能不是最好的解决方案,但不幸的是,它不是我的设计,而且我仅限于我们客户想要的框架。非常感谢 – Adam 2010-04-22 01:48:01

0

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

“当从GAC加载的程序集的完全限定程序集名称,包括版本,区域性和公钥必须指定这是在标准语法的支持的System.Type .GetType请参阅下一个关于如何获取程序集版本和公钥的FAQ。“

+0

感谢您的更新,但我很困惑我将如何改变我的appender。这里是我的appender标签: 然后我用appender-ref引用它。即: 在任何时候,我都不会使用GAC中类的名称。 – Adam 2010-04-22 01:13:39

+0

我只是拉了文档中的内容。它表示,如果您将log4net放入GAC中,则必须在配置中使用全名。我知道如果您通过反射创建对象实例,除非您的类型名称包含版本和公钥,否则不能从GAC创建实例。 – 2010-04-22 12:55:30

0

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

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