私は C# クラス ライブラリ プロジェクトに取り組んでいます。このプロジェクトは、log4net.dll などの他の DLL ファイルを参照します。このプロジェクトには、log4net.dll を使用するクラスが 1 つだけあります。他のプロジェクトが自分のプロジェクトを参照している場合、他のプロジェクトが log4net.dll を使用するクラスを呼び出している場合にのみ、log4net.dll をその bin フォルダーにコピーします。
これは実現可能ですか?
ライブラリを 2 つに分割し、メイン ライブラリから log4net.dll の参照を削除し、log4net.dll を必要とする部分に関連付けられたものが必要な場合にのみ、2 番目のライブラリを参照します。
このようなケースを処理する良い方法は、依存性注入です - Enterprise Library (unity container) を見てください - しかし、それはあなたに1つの余分なdllを与えます:)
Unity コンテナーの使用:
Library1 には ILog4NetUsingInterface が含まれています。
Library2 には、クラス Log4NetUsingClass : ILog4NetUsingInterface があります。
Library2 には、Log4NetUsingClass を ILog4NetUsingInterface の実装として登録するブートストラップがあります。
public static class Bootstrapper {
public static void Init() {
ServiceLocator.IoC.RegisterSingleton<ILog4NetUsingInterface, Log4NetUsingClass>();
}
}
この Init メソッドは、Log4NetUsingClass を使用する必要がある場合にのみ呼び出します
他のすべてのライブラリでは、呼び出すことができます
ServiceLocator.IoC.Retrieve<ILog4NetUsingInterface>()
(ブートストラップを呼び出さないと、実行時エラーが発生します。)