web-dev-qa-db-ja.com

別のプロジェクトの設定ファイルにアクセスする

別のプロジェクトから設定ファイルにアクセスする方法はありますか?たとえば、2つのプロジェクトを含むソリューションがあります(Proj1とProj2と呼びます)。 Proj1のProgram.csからProj2のアプリケーション設定にアクセスしたい。これは可能ですか?

40
KrisTrip

オプションA:他のアセンブリの構成ファイル(設定が保存されている)から値を解析します

オプションB:設定から必要な値を静的プロパティとして公開するProj2でパブリッククラスを作成し、Proj1でアセンブリを参照し、そのクラスの値を使用します。

オプションC:すべての設定を公開する場合は、設定クラスのアクセスをinternalからpublicに変更できます。

他の方法もあると思います。

32
Jay

C#を使用している場合の答え:
非常に簡単な答えは、proj2を右クリックして[設定]タブを選択することです。上部に、設定クラスのアクセス修飾子があります:内部、パブリックに変更します。 proj2 Settingsクラスを表示するには、proj1のproj2への参照を追加します。それで全部です。

50
Nour El-Dien

今後の参照用に、@ Kildareflareのリンクの内容を再投稿します。それでもVS2015で動作しますが、私自身は上記の「オプションB」を好むと思います。

別のプロジェクトの設定へのアクセスを取得する

Visual Studio 2005の新しいクールな機能の1つは、新しいプロパティエディターです。このプロパティエディターを使用すると、アプリケーションに設定を簡単に追加できます。しかし、実装方法に問題があります。理由を説明させてください。

通常、設定はプロジェクトに固有です。プロジェクトに設定を追加すると、設定ファイルに関連付けられた特別なカスタムツールが、アクセスに使用できる新しいクラスを生成します。このクラスの良いところは、強い型付けです。しかし、舞台裏では、xmlファイルからキーを取得するだけです。この生成されたクラスは、「内部シール」として設定されます。これにより、他のアセンブリからアクセスできなくなります。これらの設定を編集する場所を一元化する場合はどうでしょう。

それを公開するための多くの試みの後、私はそれをする簡単で簡単な方法を見つけました。ソリューションに2つのプロジェクトがあるとしましょう。エンジンとWinAppです。それぞれに設定がありますが、WinAppから編集できるようにします。これがどのように見えるかです。

Settings Before

ここでエンジン設定にアクセスしたい場合は、トリック:リンクファイルを追加します。

Add Link

リンクファイルは、WinAppプロジェクトの一部としてコンパイルされます。設定クラスは引き続き内部であり、封印されますが、エンジンではなくWinAppプロジェクトになります。

最終結果は次のとおりです。

Settings After

Engineプロジェクトと同じ名前のフォルダーを追加したことに注意してください。これは、多くのプロジェクトから設定を追加する場合に役立ちます。

これを配置すると、WinAppクラスからのようにエンジンクラスからエンジン設定にアクセスできます。同じ名前空間にいる必要があるため、エンジンクラスから「エンジン」部分を省略できます。これは次のようになります。

namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}
4
woodvi

設定を含むプロジェクトのApp.configでXMLトランフォーム(SlowCheetah経由)を使用していたため、ここで既に示したもの以外に別のソリューションを考え出す必要がありました。これを行っていない場合は、他の解決策のいずれかをお勧めします。

Proj2の出力フォルダーから構成ファイルをコピーするために、使用するプロジェクト(例ではProj1)にアフタービルドステップを追加しました。これにより、構成にトランスフォームが確実に適用されます。 (私の場合、Proj1はdllですので、exeの場合は、DestinationFilesを「.dll.config」から「.exe.config」に変更してください。)Proj1.csprojのスニペット:

<Target Name="AfterBuild">
  <Copy SourceFiles="..\Proj2\bin\$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)\$(AssemblyName).dll.config" />
</Target>

次に、Ctrlキーを押しながらShiftキーを押しながらファイルをProj1にドラッグして、Proj2からSettings.settingsのリンクを作成しました(Kildareflareで参照されるブログ記事のように)。

次に、Proj1で次のような設定を参照できます。Proj2.Properties.Settings.Default.MySetting

注:私(Proj1はテストDLL)のような単体テストに対してこれを行い、ReSharperテストランナーを使用している場合は、必ず 個別のAppDomainsでテストを実行するように構成してください .

0
Matt Miller