none
Client Profileで使用するSystem.Design RRS feed

  • 質問


  • 環境
    + Windows7 Pro x64
    + VisualStudio2010 Pro

    プロジェクト環境
    プロジェクト
    + Windowsフォームアプリケーション

    対象のフレームワーク
    + .NET Framework 4 Client Profile


    こんにちは。
    C# .NET4 CLIENT PROFILE環境での、カスタムコントロールの作り方について質問です。

    私は.NET4 CLIENT PROFILEでプログラムを作成しているのですが、
    .NET4は今までの.NETと異なり、FULLとCLIENT PROFILEに分かれていて、
    CLIENT PROFILEの方が軽量で一般ユーザー向け?だと聞いています。(間違っていたらすいません)

    しかし、CLIENT PROFILEではSystem.Designが参照できないようで、上手くカスタムコントロールを作成することができません。(GUIの部分をきちんと設定できない)
    また、下手に.NET4FULL時に利用しているSYSTEM.DESIGNを強引に参照設定に追加しても、
    CLIENT PROFILEでは、存在しないDLLが必要になってしまうのでユーザーでは動かなくなるのでは? と懸念しています。

    FULLの時なら使えるDLL
    C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Design.dll


    こうした問題に対して参考の1(佐祐理さんの発言2011年3月1日 0:35)では、
    文字列引数のEditorAttributeを利用して解決するような回答を発見しました。
    ためしに、以下のようなプロパティを作成してみたのですが、意図したような(File選択を呼び出せるタイプ)デザインは追加されませんでした。(ただプロパティを追加しただけ)

    > 実行時はSystemDesign.dllを必要とせずClient Profileで動作でき、デザイン時のみにFull Frameworkを要求する

    [Category("test"), Description("説明"), Editor("System.Windows.Forms.Design.FileNameEditor", "System.Drawing.Design.UITypeEditor")]
    public string abc {
    get { return _abc; }
    set {_abc = value;}
    }

    名前空間とクラス名だけだと、どのアセンブリにあるかわからないので、アセンブリを明示する部分が必要なんだと思われる……のですが、(参考2)

    上記の懸念(ユーザーが動かないのでは)と衝突していて混乱しています。上記の方法で直接SYSTEM.DESIGNを参照設定に追加しても、ユーザーは大丈夫なものなのでしょうか?

    以上、質問したい所は、2点です。
    1.アセンブリの参照のやり方か仕組みの部分が、よくわかっていないこと
    2..NET4で通常?(FULL)とCLIENT PROFILEを選択を分けるポイント


    よろしくおねがいします。

    参考1
    http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/0e79f35b-6f75-41f7-a950-587cf7b99358

    参考2(元の質問場所)

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=58121

    2011年3月29日 1:55

回答

  • [Editor(
      "System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
      "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    )]

    と書けばよさそうです。(SqlConnectionStringBuilder.AttachDBFilenameにそう書かれていました。)

    なおReference Assembliesディレクトリを挙げられていますが、こちらは(4.0から?)本当の参照用のファイルでありコードを含んでいないため、実行時に使うことはできません。

    では、どれが本物かというと、Visual Studioコマンドプロンプトから

    gacutil /l System.Design

    を実行すると検索して表示してくれます。

    • 回答としてマーク めめ 2011年3月30日 1:12
    2011年3月29日 2:47
  • バージョンやカルチャは参照プロパティからなんとなくわかりましたが、PublicKeyTokenというのはアセンブリフォルダの中身の値でよいのでしょうか?仕組みを良く理解していないので、申し訳ないのですが、これは全てのパソコンなどで同じ値が設定されているものなのでしょうか?

    アセンブリの発行者の署名に関する情報です。
    このトークン情報と、実際のアセンブリの署名情報をつきあわせて、同じ発行者が配布しているものであるか、改ざんされていないかを検証するはずです。
    詳しいことは、私の説明を鵜呑みにせず、厳密な名前とか、アセンブリの署名とかで探して、学んでください。

    マシンによらず、発行者が同じキーを使う限り、同じ値になります。

    また、このトリビュートは、ファイルを指定するプロパティなど、毎回つけなくてはいけないと思います。

    C++では例えば、プリプロセッサのDEFINEなんかで代替文字で切り抜けられそうな気がするのですが、C#ではどういった方法で置換したりするのでしょうか?

    そもそもこういったものの置換は不可能なのでしょうか?

    文字列のマクロ定数はありません。
    代わりといっちゃ難ですが、文字列定数にすれば一カ所で済むかもしれませんね。

    internal static class SampleClass
    {
     internal const string FileNameEditorTypeName = "System.Windows.Forms.Design.FileNameEditor, System.Design";
     internal const string UITypeEditorTypeName = "System.Drawing.Design.UITypeEditor";
    }
    
    public class TestUserControl : UserControl
    {
     [Editor(SampleClass.FileNameEditorTypeName, SampleClass.UITypeEditorTypeName)]
     public string TestProperty { get; set; }
    }
    

    # publicKeyToken とかは省略できると思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク めめ 2011年3月30日 1:11
    2011年3月29日 14:11
    モデレータ

すべての返信

  • [Editor(
      "System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
      "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    )]

    と書けばよさそうです。(SqlConnectionStringBuilder.AttachDBFilenameにそう書かれていました。)

    なおReference Assembliesディレクトリを挙げられていますが、こちらは(4.0から?)本当の参照用のファイルでありコードを含んでいないため、実行時に使うことはできません。

    では、どれが本物かというと、Visual Studioコマンドプロンプトから

    gacutil /l System.Design

    を実行すると検索して表示してくれます。

    • 回答としてマーク めめ 2011年3月30日 1:12
    2011年3月29日 2:47
  • 佐祐理さん

    返信ありがとうございます。

    [Editor(
      "System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
      "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    )]

     

    これは、参照設定にSystem.Designを追加しないくていいためのコードが抜けていた、ということですよね。

    バージョンやカルチャは参照プロパティからなんとなくわかりましたが、PublicKeyTokenというのはアセンブリフォルダの中身の値でよいのでしょうか?

    仕組みを良く理解していないので、申し訳ないのですが、これは全てのパソコンなどで同じ値が設定されているものなのでしょうか?

     

    参照先(公開キートークン)

    C:\Windows\assembly

     

    また、このトリビュートは、ファイルを指定するプロパティなど、毎回つけなくてはいけないと思います。

    C++では例えば、プリプロセッサのDEFINEなんかで代替文字で切り抜けられそうな気がするのですが、C#ではどういった方法で置換したりするのでしょうか?

    そもそもこういったものの置換は不可能なのでしょうか?

     

    以上、よろしくおねがいします。

     


    2011年3月29日 5:29
  • バージョンやカルチャは参照プロパティからなんとなくわかりましたが、PublicKeyTokenというのはアセンブリフォルダの中身の値でよいのでしょうか?仕組みを良く理解していないので、申し訳ないのですが、これは全てのパソコンなどで同じ値が設定されているものなのでしょうか?

    アセンブリの発行者の署名に関する情報です。
    このトークン情報と、実際のアセンブリの署名情報をつきあわせて、同じ発行者が配布しているものであるか、改ざんされていないかを検証するはずです。
    詳しいことは、私の説明を鵜呑みにせず、厳密な名前とか、アセンブリの署名とかで探して、学んでください。

    マシンによらず、発行者が同じキーを使う限り、同じ値になります。

    また、このトリビュートは、ファイルを指定するプロパティなど、毎回つけなくてはいけないと思います。

    C++では例えば、プリプロセッサのDEFINEなんかで代替文字で切り抜けられそうな気がするのですが、C#ではどういった方法で置換したりするのでしょうか?

    そもそもこういったものの置換は不可能なのでしょうか?

    文字列のマクロ定数はありません。
    代わりといっちゃ難ですが、文字列定数にすれば一カ所で済むかもしれませんね。

    internal static class SampleClass
    {
     internal const string FileNameEditorTypeName = "System.Windows.Forms.Design.FileNameEditor, System.Design";
     internal const string UITypeEditorTypeName = "System.Drawing.Design.UITypeEditor";
    }
    
    public class TestUserControl : UserControl
    {
     [Editor(SampleClass.FileNameEditorTypeName, SampleClass.UITypeEditorTypeName)]
     public string TestProperty { get; set; }
    }
    

    # publicKeyToken とかは省略できると思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク めめ 2011年3月30日 1:11
    2011年3月29日 14:11
    モデレータ
  • Azuleanさん

    おっしゃる通り、パブリックキーなしでも動きました。

    文字列の部分はXML形式のテキストとかアセンブリリソースを用意して解決するような気がしていましたが、シンプルでよかったです。

    /// <summary>
    /// ファイルを選択できるGUIのテスト。
    /// </summary>
    [Category("test"), Description("説明"), Editor("System.Windows.Forms.Design.FileNameEditor, System.Design", "System.Drawing.Design.UITypeEditor")]
    public string abc
    {
                get;
                set;
    }

     

    単純に文字列でSystem.Designを指定していなかったということだったんですね。

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

     


    2011年3月30日 4:38
  • 名前の指定方法は完全修飾型名の指定で説明されています。もちろんアセンブリ名以外は省略可能です。

    ただし、publickeytokenを省略してしまうと誰かが同名のアセンブリ・クラスを作成した場合にそちらを読み込んでしまう危険性があります。

    そのため、単に動作するだけでなく、正しい記述を回答しました。

    2011年3月30日 5:12
  • フォローありがとうございます。

    文字列定数にすれば一カ所になるのでPublicTokenもごちゃつかずに管理出来そうなので、合わせて設定するようにします。

     

    細かく説明して頂いて、ありがとうございました。

     

    2011年3月30日 7:02