最近、IPアドレスを必要とするクラスを含むDLLをC#(.Net 2.0)で作成しました。私の同僚は、「。dll.config」(XML)ファイルからIPを取得するようにクラスを変更しました。これは、彼が作成した「アプリケーション設定」ファイル(Settings1.settings)によって自動的に生成されるようです。これの利点は、エンドユーザーがXML/configファイルのIPアドレスを自由に変更できるようにすることでした。
残念ながら、彼のコードをツリーからチェックアウトしてこの新しいコードをコンパイル(または使用)しようとすると、このDLLを呼び出すアプリケーションは、ファイルからの値ではなく、デフォルト値のみを取得します。
構成ファイルを呼び出すコンストラクターは次のようになります。
public class form : System.Windows.Forms.Form
{
public form()
{
// This call is required by the Windows Form Designer.
InitializeComponent();
IP = IPAddress.Parse(Settings1.Default.IPAddress);
}
}
ユーザーが言ったMSDNフォーラムでこの問題への参照を見つけました:
「古い」値(開発時に定義した値)はハードコーディングされています。franeworkが構成ファイルにアクセスまたは開くことができない場合は、代わりにデフォルトが使用されます。これは、dllの設定を使用する場合に常に発生します。
これは、DLLの外部値を構成ファイルに保存できないことを意味しますか?(私の同僚はどういうわけかこの仕事をしました...)
フレームワークが構成ファイルにアクセスまたは開くことができないように見えるので、なぜ失敗するのかを理解するにはどうすればよいですか?または、これがいつ発生するかを検出しますか?
デッカー:それは少し役立ちます。残念ながら、私はこのDLLを仕様に書き込んでいるため、実際にはアプリケーションの構成ファイルにアクセスできません。上記のように、私の同僚は「設定1.settings」ファイルを作成しました。当時は理解できませんでしたが、「1」を追加すると、それを呼び出すアプリケーションの設定スペースから外れるようになりました。
私が理解しようとしているのは、DLLが同じディレクトリの隣にある構成ファイルを見つけられない理由だと思います。コードを段階的にトレースしても、何もわかりません。
余談ですが、アセンブリの「出力タイプ」を「クラスライブラリ」から「Windowsアプリケーション」に変更し、DLLコードの先頭に次の行を追加できます。
[STAThread]
public static void Main(string[] args)
{
System.Windows.Forms.Application.Run(new form());
}
これを実行すると、別の構成ファイル( ".exe.config")が生成され、そのファイルを変更して、ファイルから新しいデータを取得することができます。だから私は少し混乱しています。何か案は?