none
VS2013 アプリケーション設定-型-参照について RRS feed

  • 質問

  • 2件あります

    ・[本題]参照から手動入力で型を参照させようとしても「定義されていない」となる

    ・[報告]参照ダイアログが開かない

    環境
    Win7 x64 VS2013 Ultimate

    サンプルとして
    http://msdn.microsoft.com/ja-jp/library/vstudio/aa972163(v=vs.90).aspx
    こちらでダウンロードできるサンプルのC#コードを使いました。

    アプリケーション設定(ソリューションエクスプローラー - プロジェクトのプロパティ - アプリケーション設定)を開くとSaveWindowPlacementStateSample.WINDOWPLACEMENT 型の WindowPlacement 項目があります。
    これを一度削除して保存、VS2013を再起動して読み込み直します。

    削除した項目を元に戻すため、型のドロップダウンから「参照」を選択します。
    ダイアログには表示されてないので「選択された種類」に
    SaveWindowPlacementStateSample.WINDOWPLACEMENT
    と入力して型を参照させようとすると「定義されていない」となってしまいます。
    名前空間 SaveWindowPlacementStateSample に WINDOWPLACEMENT は存在するのですが
    何か手順が抜けているのでしょうか?

    settings.designer.cs を開き、削除された以下のコードを書き戻すと動作しますが
            [global::System.Configuration.UserScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public global::SaveWindowPlacementStateSample.WINDOWPLACEMENT WindowPlacement {
                get {
                    return ((global::SaveWindowPlacementStateSample.WINDOWPLACEMENT)(this["WindowPlacement"]));
                }
                set {
                    this["WindowPlacement"] = value;
                }
            }
    settings.designer.cs 自体が自動生成されるファイルなので
    アプリケーション設定のGUIに戻り別の項目を追加など、編集してしまうと自動生成により書き戻したコードが消えてしまいます。

    コードで追加して、アプリケーション設定のGUIを開かないようにする。という方法以外になにかよい方法はないでしょうか。

    また、参照ダイアログを開き適当な項目を選択してダイアログを閉じたあと
    フォーカスを動かさずに再度ドロップダウンから「参照」を選択してもダイアログが表示されない状態になりました。
    VS2013 Ultimate以外では確認していません。

    2013年11月9日 21:38

回答

  • 設定デザイナから、プロジェクト自身で定義している型を設定できないのは昔からそういうものです。
    基本的にプロジェクトが参照しているクラスライブラリに存在するpublicな型のみが参照できます。
    #プロジェクトの参照で自分自身を参照させてもできませんが...

    方法1
    Settings.settingsを右クリックして、「ファイルを開くアプリケーションの選択」で「設定デザイナー(規定)」ではなく「自動エディターセレクター(XML)」を選択して開く。(メモ帳などでもいい)

    <Setting Name="WindowPlacement" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    のような項目を探し、Type="SaveWindowPlacementStateSample.WINDOWPLACEMENT"に変更して保存する。

    設定デザイナーで開くとWINDOWPLACEMENT型になっているのが確認できる。

    方法2
    settings.Designer.cs以外のファイルにpartialクラスとして定義すると、自動再生成では消えなくなります。
    ただし、設定デザイナーには表示されません。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace SaveWindowPlacementStateSample.Properties
    {
        partial class Settings
        {
            [global::System.Configuration.UserScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public global::SaveWindowPlacementStateSample.WINDOWPLACEMENT WindowPlacement {
                get {
                    return ((global::SaveWindowPlacementStateSample.WINDOWPLACEMENT)(this["WindowPlacement"]));
                }
                set {
                    this["WindowPlacement"] = value;
                }
            }
        }
    }

    また、参照ダイアログを開き適当な項目を選択してダイアログを閉じたあとフォーカスを動かさずに再度ドロップダウンから「参照」を選択してもダイアログが表示されない状態になりました。
    VS2013 Ultimate以外では確認していません。
    VS2010pro VS2013proでも現象は確認できました。バグっぽいですね。
    connect に報告してみたらいいかもしれません。
    #セルを確定するだけで回避できるので修正されるかまではわかりません。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク takezou2k 2013年11月10日 3:29
    2013年11月10日 0:32

すべての返信

  • 設定デザイナから、プロジェクト自身で定義している型を設定できないのは昔からそういうものです。
    基本的にプロジェクトが参照しているクラスライブラリに存在するpublicな型のみが参照できます。
    #プロジェクトの参照で自分自身を参照させてもできませんが...

    方法1
    Settings.settingsを右クリックして、「ファイルを開くアプリケーションの選択」で「設定デザイナー(規定)」ではなく「自動エディターセレクター(XML)」を選択して開く。(メモ帳などでもいい)

    <Setting Name="WindowPlacement" Type="System.String" Scope="User">
      <Value Profile="(Default)" />
    </Setting>
    のような項目を探し、Type="SaveWindowPlacementStateSample.WINDOWPLACEMENT"に変更して保存する。

    設定デザイナーで開くとWINDOWPLACEMENT型になっているのが確認できる。

    方法2
    settings.Designer.cs以外のファイルにpartialクラスとして定義すると、自動再生成では消えなくなります。
    ただし、設定デザイナーには表示されません。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace SaveWindowPlacementStateSample.Properties
    {
        partial class Settings
        {
            [global::System.Configuration.UserScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public global::SaveWindowPlacementStateSample.WINDOWPLACEMENT WindowPlacement {
                get {
                    return ((global::SaveWindowPlacementStateSample.WINDOWPLACEMENT)(this["WindowPlacement"]));
                }
                set {
                    this["WindowPlacement"] = value;
                }
            }
        }
    }

    また、参照ダイアログを開き適当な項目を選択してダイアログを閉じたあとフォーカスを動かさずに再度ドロップダウンから「参照」を選択してもダイアログが表示されない状態になりました。
    VS2013 Ultimate以外では確認していません。
    VS2010pro VS2013proでも現象は確認できました。バグっぽいですね。
    connect に報告してみたらいいかもしれません。
    #セルを確定するだけで回避できるので修正されるかまではわかりません。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク takezou2k 2013年11月10日 3:29
    2013年11月10日 0:32
  • 理解できたと思います。

    ・ダイアログにはプロジェクトが参照しているクラスライブラリのpublicな型が表示される
    ・プロジェクト自身に含まれる型はコードを書いて回避可能
    ・クラスライブラリ側を編集した場合はビルドするまで反映されない

    気をつけないとですね。

     GUIのみで期待値を得ようとしたのが反省点でした。
    サンプルでは型指定出来ている以上、しっかりコードとで比較するべきでした。

    方法1.2 どちらもケースバイケースで対応したいと思います。

    ダイアログが表示されない件はConnectにて報告いたしました。
    https://connect.microsoft.com/VisualStudio/feedback/details/808189/visualstudio

    回答有難うございました。
    takezou2k

    2013年11月10日 4:12