none
.net2.0Frameworkからアプリケーション構成ファイル(App.config)の値を取得する時にエラー発生 RRS feed

  • 質問

  • 現在、.netFramework2.0(VB.net)上で実行させるWindowsアプリケーションを作成しております。
    そのアプリケーションから.netFramework1.1ベースのDLLを呼び出す必要がありますが、1点問題があります。
    DLL内の処理で、以下のApp.configから値を取得する箇所でエラーが発生します。

    this.sqlCommand.CommandTimeout = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["COMMAND_TIMEOUT"]);

    原因は.netFramework2.0でApp.configから値を取得する方法が変わったためと思われます。
    しかし、.netFramework1.1のWindowsアプリケーションからも同じ処理が呼び出されるため、

    System.Configuration.ConfigurationManager.AppSettings["COMMAND_TIMEOUT"]

    のように変更することは出来ません。
    当エラーを回避する方法はあるでしょうか?
    (回避策として値の取得先をApp.configからiniファイルなどに変更することを考えていますが、
      他に良い方法があれば、ご教示いただけると助かります。)

    2010年11月10日 7:21

回答

  • .NET Framework 1.1 でビルドされた DLL であっても、.NET Framework 2.0 のアプリケーションから呼ばれると、.NET Framework 2.0 の上で動いてしまいます。
    1つのアセンブリを .NET Framework 1.1 と 2.0 とで共通利用しようとすることに無理があるように思うのですが...。

    条件付きコンパイルを使って、同じソース コードから 2 種類のアセンブリを作る方が健康的ではないでしょうか。

    ConfigurationSettings は古い形式の警告が出るだけで使えはするもんだと思っていたのですが、1.1 ベースで作ったアセンブリをリンクする時にはエラーになるんでしょうか。
    2010年11月10日 9:59
  • どのようなエラーが発生するのでしょうか?

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="COMMAND_TIMEOUT" value="10" />
      </appSettings>
    </configuration>

    及び

    Console.WriteLine(int.Parse(ConfigurationSettings.AppSettings["COMMAND_TIMEOUT"]));

    で期待通り「10」と表示されましたが。

    2010年11月10日 12:14
  • ご回答ありがとうございます。

    >NET Framework 1.1 でビルドされた DLL であっても、.NET Framework 2.0 のアプリケーションから呼ばれると、.NET Framework 2.0 の上で動いてしまいます。
    >1つのアセンブリを .NET Framework 1.1 と 2.0 とで共通利用しようとすることに無理があるように思うのですが...。

    やはり厳しいですか。。


    >条件付きコンパイルを使って、同じソース コードから 2 種類のアセンブリを作る方が健康的ではないでしょうか。

    条件付きコンパイルについてはあまり知らなかったので、検討してみます。


    >ConfigurationSettings は古い形式の警告が出るだけで使えはするもんだと思っていたのですが、1.1 ベースで作ったアセンブリをリンクする時にはエラーになるんでしょうか。

    私も警告が出るだけだと思いましたがエラーとなりました。

    2010年11月10日 14:55
  •         public static NameValueCollection AppSettings {
                get {
                    return ConfigurationManager.AppSettings;
                }
            }

    なのに何のエラーになるのやら…。

    2010年11月10日 15:51
  • 解決しました。

    App.configの記述方法に問題がありました。

    取得できていなかった項目が<applicationSettings>タグの中に定義されていました。

    佐祐理さんが書かれているように<appSettings>タグを追加して、その中に定義したところ取得できるようになりました。

    ありがとうございました。

    2010年11月11日 3:07

すべての返信

  • .NET Framework 1.1 でビルドされた DLL であっても、.NET Framework 2.0 のアプリケーションから呼ばれると、.NET Framework 2.0 の上で動いてしまいます。
    1つのアセンブリを .NET Framework 1.1 と 2.0 とで共通利用しようとすることに無理があるように思うのですが...。

    条件付きコンパイルを使って、同じソース コードから 2 種類のアセンブリを作る方が健康的ではないでしょうか。

    ConfigurationSettings は古い形式の警告が出るだけで使えはするもんだと思っていたのですが、1.1 ベースで作ったアセンブリをリンクする時にはエラーになるんでしょうか。
    2010年11月10日 9:59
  • どのようなエラーが発生するのでしょうか?

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="COMMAND_TIMEOUT" value="10" />
      </appSettings>
    </configuration>

    及び

    Console.WriteLine(int.Parse(ConfigurationSettings.AppSettings["COMMAND_TIMEOUT"]));

    で期待通り「10」と表示されましたが。

    2010年11月10日 12:14
  • ご回答ありがとうございます。

    >NET Framework 1.1 でビルドされた DLL であっても、.NET Framework 2.0 のアプリケーションから呼ばれると、.NET Framework 2.0 の上で動いてしまいます。
    >1つのアセンブリを .NET Framework 1.1 と 2.0 とで共通利用しようとすることに無理があるように思うのですが...。

    やはり厳しいですか。。


    >条件付きコンパイルを使って、同じソース コードから 2 種類のアセンブリを作る方が健康的ではないでしょうか。

    条件付きコンパイルについてはあまり知らなかったので、検討してみます。


    >ConfigurationSettings は古い形式の警告が出るだけで使えはするもんだと思っていたのですが、1.1 ベースで作ったアセンブリをリンクする時にはエラーになるんでしょうか。

    私も警告が出るだけだと思いましたがエラーとなりました。

    2010年11月10日 14:55
  •         public static NameValueCollection AppSettings {
                get {
                    return ConfigurationManager.AppSettings;
                }
            }

    なのに何のエラーになるのやら…。

    2010年11月10日 15:51
  • 解決しました。

    App.configの記述方法に問題がありました。

    取得できていなかった項目が<applicationSettings>タグの中に定義されていました。

    佐祐理さんが書かれているように<appSettings>タグを追加して、その中に定義したところ取得できるようになりました。

    ありがとうございました。

    2010年11月11日 3:07