C# 关于dll继承的一个问题

C# 关于dll继承的一个问题,c#,inheritance,dll,C#,Inheritance,Dll,我创建了一个将由多个应用程序使用的dll,并创建了一个安装程序包,将其安装到程序文件中,并将其添加到全局程序集缓存中 dll本身使用log4net,并且需要一个xml文件作为日志定义 因此,当安装程序运行时,以下文件将复制到程序文件中的安装目录: 我开发的主dll -Log4Net.dll -Log4Net.xml文件 我现在遇到了一个问题。我已经创建了一个用于实验的测试控制台应用程序。我已将我的dll添加为引用,并将“本地副本”标志设置为false 然而,当我编译测试控制台exe时,我注意到它

我创建了一个将由多个应用程序使用的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文件是安装到程序文件中的文件,而不是通过本地副本复制所需的任何应用程序?将使用my dll的应用程序不会使用log4net,只有它们引用的dll使用它

非常感谢

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

  • 我怀疑您的问题在于配置。如果您希望GAC提供的服务能够正常工作,则必须使用完全限定名。根据以下文件:

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


    我也通过向GAC添加Log4net.dll来解决这个问题。它现在将运行,而不需要dll的本地副本


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

    不幸的是,必须依赖任何DLL的本地副本不是一个选项-这是由于项目的要求,因为客户希望能够运行独立的exe。这就是为什么我把我的DLL添加到GAC。这是猪的唇膏。它不是一个独立的exe,它需要GAC中的一个程序集和一个配置它的xml文件。拥有“独立exe”的唯一一点是不需要安装程序。这是一个不会飞的清管器。它需要是独立的,能够从主机上的任何目录运行。客户端需要一个干净的目录,其中包含可以运行的exe,而不是一个目录,其中包含exe和支持DLL/xml文件。实际上,通过简单地将log4net.dll添加到GAC中,我几乎可以让它正常工作了,但现在我遇到了一个问题,它无法获取xml文件。然而,这是向前迈出的一步。我同意你的想法,这可能不是最好的解决方案,但不幸的是,这不是我的设计,我只限于我们的客户想要的框架。许多人认为创建错误的应用程序是因为客户的请求不是特别明智的。根据我的经验,实际上向客户暗示依赖“目录”中没有额外文件的.exe文件并不是一个特别好的要求,这通常是值得的(如果它不需要安装程序,我可以理解,但它确实需要)。您可以使用链接器,但这并不能解决xml文件的问题。谢谢您的更新,但是我不知道如何更改我的appender。这是我的appender标签:然后我用appender-ref引用它。也就是说:在任何时候我都不使用GAC中的类的名称。我只是提取了文档中的名称。它说如果你把log4net放在GAC中,你必须在配置中使用全名。我知道,如果您通过反射创建对象实例,那么您无法在GAC之外创建实例,除非您的类型名包含版本和公钥。