我的解决方案中有一些插件架构。 有一个众所周知的文件夹,可以在其中放置插件。 插件实现了一个在主机项目中共享的接口。
最初我通过Assembly.LoadFrom(fi.FullName).GetTypes()
加载插件
并通过(IPlugin)Activator.CreateInstance(type);
实现所需的类型。
因此主机(主应用程序)可以执行插件程序集实现的适当代码。到目前为止,此工作正常。
但是最近我尝试通过NLog实现应用程序日志记录,并在主机项目中配置NLog,效果很好。
问题是我想在插件程序集中使用(已配置的)记录器。
如果我只引用NLog并由LogManager.GetCurrentClassLogger();
使用它,似乎没有配置集。它不会在插件程序集中记录我在主机项目中配置的文件。
我想过尝试将NLogger实例(在主机项目中创建)注入插件类型的属性。
这是可能的,还是有一种首选方式来完成这样的事情? 感谢
答案 0 :(得分:2)
这应该工作 - NLog配置也适用于加载的插件程序集。 问题可能与插件的加载方式有关。也许它们位于一个单独的域中(我不记得它是如何工作的)所以NLog无法访问主应用程序的日志配置。
在这种情况下,您可以尝试为插件程序集添加单独的nlog配置文件(阅读有关配置文件命名约定的nlog文档)。
我不认为IOC容器会在动态加载插件的情况下帮助您 - 容器不会知道它们,因此您必须更改插件的加载和配置方式。使用IOC配置nlog的imho不是一个好主意。
如果之前的选项不起作用,您可以尝试更改app.config中的程序集探测路径,以便将插件加载到默认域中 - 然后NLog应该适用于这些插件(至少适用于我):
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Plugins" />
</assemblyBinding>
答案 1 :(得分:1)