这是“问题”。我开发的每个库都记录了一些内容,但是我不想让库用户知道这一点并安装我将使用的log4net或类似的日志记录实现。聪明人如何创建独立程序集?
对于库用户来说,记录输出并不重要,除非他或她真的想看到调试/信息输出。在这种情况下,他将安装log4net并告诉库通过配置文件以某种方式使用它。否则我想发送我的库而没有任何不相关的依赖。这可能吗?有什么选择?
在C ++中,我只需创建几个dll / so(有和没有日志记录)静态链接它们与所需的库集,如果有人需要一个启用了日志的库,他只需用另一个版本覆盖它。 / p>
答案 0 :(得分:4)
好主意;像这样的东西是使图书馆的作家和消费者的生活更轻松的细节!
DotNetOpenAuth执行此操作
我知道DotNetOpenAuth库的行为与您描述的方式相同。它使用log4net,但仅当它由消耗组件存在和配置时才使用。来自README.Bin.html:
log4net.dll 如果存在且v1.2.10, 将允许记录日志消息 这个库发出。
您自己的应用中还有an informative page on how to configure DotNetOpenAuth logging。
<强> [编辑] 强> 我检查了他们的源代码,他们动态检查log4net程序集并加载+连接它(如果存在)(在Log4NetLogger.cs&amp; Logger.cs中)。正如您在下面的评论中所提到的,它们在编译期间需要log4net,因为它在几个地方被引用。聪明的部分是,因为当检查失败时会跳过所有特定于log4net的代码,当缺少log4net程序集时将没有运行时问题。
DotNetOpenAuth是一个开源项目,所以你应该能够模仿他们浏览初始化代码的方法。
答案 1 :(得分:3)
这是一个很好的跟踪介绍,这是我喜欢使用的,组装的消费者也可以使用它。
答案 2 :(得分:1)
我能看到的唯一选择是用你的应用程序完全封装一些东西;两个选项:
但最重要的是(据我所见),log(config)通常是人们需要在某些时候弄乱的东西,因为它通常是特定于环境的,所以我怀疑你可以保护所有用户不必一直都知道这件事。
答案 3 :(得分:1)
我遇到了同样的问题。我的库只有78KB,但需要238KB的log4net依赖。所以我写了一个抽象类,只有当它存在时才动态加载log4net:
static Logger() {
try {
Assembly.Load("log4net");
_loggingIsOff = false;
} catch {}
}
public static ILog CreateLog() {
var frame = new System.Diagnostics.StackFrame(1, false);
var type = frame.GetMethod().DeclaringType;
return _loggingIsOff ? (ILog)new NoLog() : new Log4NetLogger(type);
}
...
}
完整代码的链接是here
答案 4 :(得分:0)
您可以考虑使用具有足够广泛的再分发许可证的日志记录库,该许可证允许您将其与源代码一起分发。大多数基于BSD的许可证允许您这样做。
我有偏见,但http://www.logog.org可能会根据一些非常广泛的许可条款重新分发,并且可能符合您的要求。