2012-03-20 12 views
1

私はいくつかのUserControlsを含むWinFormプロジェクトを持っています。このWinFormプロジェクトには、別のソリューションに存在する別のプロジェクト(クラスライブラリ)から作成されたアセンブリ(lib.dllと呼びます)への参照があります。デザイン時にクラスライブラリから設定ファイルを読み込む代わりに?

ここで、UserControlsのいくつかはlib.dllを呼び出し、app.configファイルから値を返します。実行時にlib.dllが正常に動作し、必要なデータが返されますが、設計時には、app.configセクションがNULL(例外は仕様)であるため、lib.dllから例外が発生しています。

今、私は、各コントロールを通過し、

if(!DesignMode) { //code } 

でLIBに呼び出し、任意のコードをラップしかし、それは行くとすることを適用するためのコントロールがたくさんある可能性があります。私はそれがよりエレガントな、次にDesignModeプロパティをテストする、グローバルにできることはありますか?

左下2つのコメントに応答して、編集

:提供ソリューションが動作するように表示されません。私の問題を引き起こしているアセンブリは、app.configと同じディレクトリにあります。一般的なディレクトリ構造は、この

  • 参照設定]フォルダのようないくつかの中
  • 設定(フォルダ)
  • appsettings.config
  • app.configを
  • lib.dll

app.config引っ張るように見えますConfiguratにあるその他の設定ファイル(appsettingscnx文字列など)イオンディレクトリ。私の例外の場合、取得しようとしている値はapp.configによって参照されるこれらの付属の設定ファイルの1つにあります。

+1

dllを含むディレクトリにapp.configファイルのコピーを追加しようとしましたか?ちょうど馬鹿。 – Khan

+0

@Jeffは正しく、2つのことができます。app.configを他のプロジェクトへのリンクにしてから、dll(Build Type:None)で展開しないように設定できます。 –

+0

返信いただきありがとうございます。あなたのソリューションはどちらも動作しませんが、私は元のポストを更新して、おそらく問題の詳細を明らかにしました。 – dparsons

答えて

0

これは興味深い質問です。ソリューションは、このようなlib.dll静的クラスで作成することができます

public static class Config 
{ 
    private static readonly _param1; 

    static Config() 
    { 
     _param1 = ConfigurationManager.AppSettings["Param1"] ?? "Your default value"; 
    } 

    public static string Param1 
    { 
     get { return _param1; } 
    } 
} 

次に、あなたのコードでは、ConfigurationManager.AppSettings [「Param1のを」]書き​​込みのinsted、あなたはConfig.Param1を使用します。したがって、DesignModeプロパティをテストする必要はありません。

0

これを行う方法はたくさんありますが、IMHO。

考えているユーザーコントロールに継承ベースのアプローチを使用することが考えられます。そのようにして、基本クラスでは、if (DesignMode)のチェックインを行い、そこから正しい分岐を実行できます。

// if i were to visualizeyour lib.dll data initializer call like this: 
class BaseUserControl 
{ 
    // i'm guessing that you initialize the data somehow... 
    void InitializeData() 
    { 
     if (!DesignMode) 
     { 
      InitializeDataLocal(); 
     } 
    } 

    protected virtual InitializeDataLocal() 
    { 
     // whatever base behavior you want should go here. 
    } 
} 

// in the derived classes, just put the code you currently have for 
// fetching the data from lib.dll here... 
class UserControl : BaseUserControl 
{ 
    protected override InitializeDataLocal() 
    { 
     // fetch from lib.dll... 

     // optionally invoke some base behavior as well, 
     // if you need to... 
     base.InitializeDataLocal(); 
    } 
} 
関連する問題