2

次のカスタムターゲットを作成しました。

[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を参照しようとすると、ロードに失敗します。プログラムでアセンブリからターゲットを追加すると(プロジェクトではなくビン参照)、機能します。

DLLは適切な場所、つまりbindirにあるようです。コードで型を参照できるため、型が存在している必要がありますが、コードで型を参照しようとすると転倒するようです。

なぜコードでそれをしないのですか?私が構築しているnugetパッケージの一部であり、このコードライブラリのすべてのコンシューマーに標準の構成ファイルを配布する必要があります。

任意の提案/アイデアをいただければ幸いです

4

1 に答える 1

3

私はばかであることがわかりました。

関係のない理由で、ルートプロジェクトレベルで元のファイルを保持しながら、ビルド時にNLog.configファイルをbinディレクトリにコピーすることにしました。これにより、NLog内で何らかの競合が発生しました。

binディレクトリから構成ファイルを削除すると、ルートレベルの構成ファイルが正しくロードされ、カスタムターゲットがexpecetedとして検出されます。プロジェクトのルートレベルから構成ファイルを削除し、それをbinディレクトリ(つまり、カスタムターゲットを含むアセンブリと同じレベル)に配置すると、ロードされた構成ファイルはカスタムターゲットを見つけることができなくなります。

要約すると、構成ファイルをbinディレクトリーに置くのをやめ、定義された場所(プロジェクトのルートレベル)に残しました。

于 2011-06-10T14:32:17.303 に答える