トップ回答者
Client Profileで使用するSystem.Design

質問
-
環境
+ 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
回答
-
[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
-
バージョンやカルチャは参照プロパティからなんとなくわかりましたが、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
すべての返信
-
[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
-
佐祐理さん
返信ありがとうございます。
[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#ではどういった方法で置換したりするのでしょうか?
そもそもこういったものの置換は不可能なのでしょうか?
以上、よろしくおねがいします。
-
バージョンやカルチャは参照プロパティからなんとなくわかりましたが、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
-
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を指定していなかったということだったんですね。
どうもありがとうございました。