我创建了以下自定义目标:
[Target("MyTarget")
public class MyTarget : TargetWithLayout
这个类是在它自己的程序集中定义的,比如说MyTargets.dll(不是真名)。NLog.config文件具有以下行
<extensions>
<add assembly="MyTargets, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</extensions>
已经定义了使用这种新类型的目标:
<target name="myTarget" xsi:type="MyTarget" />
已定义一个记录器来使用此目标(省略)。
如果我引用目标程序集项目,我的应用程序将成功加载配置。如果我尝试引用一个输出DLL,它将无法加载。如果我以编程方式从程序集中添加目标(bin引用而不是项目),那么它就可以工作了。
DLL似乎在正确的位置,即bin目录。类型必须存在,因为我可以引用代码中的类型,但在尝试引用代码中类型时,它似乎会失败。
为什么不直接用代码来做呢?它是我正在构建的nuget包的一部分,我希望将一个标准配置文件分发给这个代码库的所有使用者。
任何建议/想法都将不胜感激
原来我是个白痴。
出于无关的原因,我决定在构建时将NLog.config文件复制到bin目录,同时将原始文件保留在根项目级别。这在NLog内部引起了某种冲突。
当我从bin目录中删除配置文件时,根级别的配置文件会被正确加载,并且我的自定义目标会被发现为expeeted。如果我从项目根级别删除配置文件并将其放在bin目录中(即与包含自定义目标的程序集处于同一级别),则加载的配置文件将无法找到自定义目标。
因此,概括一下,我停止将配置文件放在bin目录中,并将其留在定义的位置(项目根级别)