我有一个问题困扰了我一段时间。几年前,当我处理使用log4net围绕某些托管提供程序实例编写通用日志记录包装程序时,遇到了这个问题。
这个想法很简单,我想编写一个日志记录和度量标准,将所有实现隐藏在一个单独的Visual Studio项目中,因此当您想向其他应用程序添加遥测支持时,您可以只包含该项目,然后新建一个记录器实例,并使用通用调用开始记录。如果您切换了提供程序或调整了日志记录设置,则不需要对主机应用程序进行任何更改。
这创建了一个强大的去耦点,主应用程序在其中使用了日志记录类库中的接口,但对日志记录类库用于完成实际工作的软件包或提供程序一无所知。
当我这样做并尝试使用Loggly的nuget软件包和log4net时,我发现调用应用程序必须具有对nuget软件包的引用,否则从属程序集将不会复制到build目录。当时,我只是以Loggly工程师所做的奇怪的方式写下来。但是自那以后,我在某些但并非所有其他软件包中都遇到了相同的行为。 (DogstatsD没问题,Raygun没问题,等等。)
我注意到程序集中的一些nuget包会自动复制到父输出目录中,但是当我寻找控制它的设置时,找不到它。
这些年来,我已经编写了数十个类库,而且在构建时,我从来没有遇到过解决链式依赖程序集(a refs b,b refs c等)的问题。似乎只有一些nuget包是一个问题。
如何强制类库项目引用的nuget包复制到构建目录中,而在应用程序中没有明确引用?
答案 0 :(得分:0)
好吧,我知道了。
这仅对于Log4Net&Loggly包装器组合组合是个问题,特别是因为它是在运行时完全引用的。 Log4net在运行时加载其所需的日志附加程序,并且由于.net在构建时未看到对程序集的引用,因此它假定未使用该程序集,并省略了将所需程序集复制到bin目录的操作。当您知道这很简单时,解决方案就是在引用的库中编写一个空的虚拟方法,您可以在主应用程序中调用该方法。这将导致.net将程序集包含在内部版本中。
虽然此问题特定于Log4net库,但在使用仅与运行时反射一起使用的程序集的任何地方,都可能发生此问题。