0

.NET 4.0 で次のシナリオがあるとします。 - 以下を含むソリューション: a) クラス ライブラリ b) コンソール アプリケーション

コンソール アプリケーションはクラス ライブラリを参照します。

私が望むのは、クラス ライブラリでいくつかのアプリケーション設定をセットアップし、それらがクラス ライブラリからアクセスできるようにすることです (ホスト コンソール アプリケーションはこれらを直接利用するべきではありません)。ただし、展開後に .config ファイルを介して変更することもできます (そのため、ユーザーがいずれかの設定の値を変更することにした場合、アプリケーションを再デプロイすることなく変更できます。

これは可能ですか?

4

2 に答える 2

1

私の知る限り、クラス ライブラリはドット ネット構成管理フレームワークを介してホスト ファイルの構成ファイルにアクセスできます。また、ライブラリに既知の名前を持つ 2 番目の構成ファイルを作成し、swme フレームワークを使用してライブラリの初期化時に手動でロードすることもできます。

System.Configuration を参照してください

var configurationFileMap = new ConfigurationFileMap(@"c:\myconfig.config");
var configuration = ConfigurationManager.OpenMappedMachineConfiguration(configurationFileMap);

ホストとライブラリの両方が、名前を知っている限り、myfile.config にアクセスできる必要があります。より一般的なものにしたい場合は、構成ファイルの名前を既知のレジストリ キーの下に保存できます。

于 2013-01-30T05:05:31.103 に答える
0

かなりのGoogle-fuの後にこれを理解しました。

私が採用した最終的な解決策は次のとおりです。Service アプリケーションに設定 (app.config ファイルを生成) を作成しました。次に、コード ライブラリ プロジェクトとコンソール アプリケーション プロジェクトの両方でこれらの設定へのリンクを作成しました (これは、[追加] > [既存の項目] に移動し、[追加] ボタンの横にあるドロップダウン矢印をクリックして、[リンクとして追加] を選択することによって行われます)。 Code Library プロジェクトのものは必要ありません。

これにより、開発中は設定構成が 1 つだけになり、開発プロセス中にコンソール アプリケーションとコード ライブラリの両方からアクセスできるコンソール アプリケーション用の構成ファイルが生成されます。

最後に、以下のコードを使用して構成ファイルを開き、値にアクセスしました。免責事項として、これを行う簡単な方法があるかもしれませんが、約100の組み合わせを試しましたが、他には何も機能しませんでした:

        String cfgFileName = "IntercompanyConsoleApp.exe.config";
        ExeConfigurationFileMap cfgMap = new ExeConfigurationFileMap();
        cfgMap.ExeConfigFilename = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + cfgFileName;

        Configuration cfg = ConfigurationManager.OpenMappedExeConfiguration(cfgMap, ConfigurationUserLevel.None);

        // IntercompanyService is the name of my service app, which is where the real app.config file resides -- hence the entries in the xml are based on this application.
        // Also, the scope of my settings entries is Application
        ClientSettingsSection section = (ClientSettingsSection)cfg.GetSection("applicationSettings/IntercompanyService.Properties.Settings"); 

        Console.WriteLine(section.Settings.Get("Server").Value.ValueXml.InnerText);
        Console.WriteLine(section.Settings.Get("Database").Value.ValueXml.InnerText);                        

これはあいまいな問題ですが、これを理解するのに約 4 時間費やしたので、将来誰かの時間を節約できることを願っています。

于 2013-01-31T20:34:20.190 に答える