2008年8月31日日曜日

[.NET]ActiveX(COM)ラッパークラスのGAC登録

ちょっと前に、.NETアセンブリからActiveX(COM)を呼び出すようなことをやっていました。
しかしそのときは、参照設定の追加→COMのタブから該当のCOMコンポーネントを選択する。というやり方をとっていました。この方法では、自動的にCOM呼び出し用のinteropアセンブリが生成されます。

GDD Blog: [.NET]ActiveX(com)呼び出し(その2)などでいろいろ試していましたが、今回はちょっと要件が違っており、関連するアセンブリと一緒にGACに登録する必要がありました。

で、関連するアセンブリのAssemblyInfo.csにkeyファイルを指定しコンパイルすると、コンパイルエラーが発生しました。調べてみるとinteropアセンブリが署名されていないことが原因ということがわかりました。

その後タイプ ライブラリ インポータ (Tlbimp.exe)の説明にたどり着きました。よく説明を見るとパラメータにkeyファイルが指定できることがわかりました。keyファイルを指定してアセンブリを生成し、そのアセンブリを参照することによりコンパイルは通過。そして、GACに両方を登録することにより正しく動作しました。

原因の糸口がつかめず「ActiveX(COM)の処理を.NETに移植するか?」なんて話も出ましたが、とりあえずギリギリセーフでした。

2008年8月28日木曜日

[.NET]ToolStripMenuItemのショートカット割り当て(その2)

GDD Blog: [.NET]ToolStripMenuItemのショートカット割り当て」で、ショートカットに「CTRL+Enter」を割り当てる方法を書きましたが、今回は「Enter」のみなどキー1つをショートカットに割り当て(いるように見え)る方法についてメモ。

いろいろ調べみても、やはり修飾(Ctrl/Altなど)なしでショットカットを割り当てることはできないことがわかりました。そこで、画面をそれらしく表現するには、以下のようにすればよいことがわかりました。コードはこんな感じ。


//コンストラクタ
public Form1()
{
    InitializeComponent();
    // メニューのショートカットキーに「↓」って表示される(デザイナから設定可能)
    toolStripMenuItem1.ShortcutKeyDisplayString = "↓";
    // 特殊なキーの押下をハンドリグするイベントをインプリメント(デザイナから設定可能)
    this.PreviewKeyDown += new PreviewKeyDownEventHandler(Form1_PreviewKeyDown);
}

void Form1_PreviewKeyDown(object senderPreviewKeyDownEventArgs e)
{
    //↓矢印押下ならメニュー押下相当の処理
    if (e.KeyCode == Keys.Down)
    {
        toolStripMenuItem1.PerformClick();
    }
}

private void toolStripMenuItem1_Click(object senderEventArgs e)
{
    MessageBox.Show(this"「↓」おされたよ");
}

2008年8月26日火曜日

[.NET]ToolStripMenuItemのショートカット割り当て

とあるお客様向けのシステムで、「コントロール+リターン」のショートカットキーを割り当ててほしい。との依頼がありました。機能はコンテキストメニューにあるので、その機能にキー割り当てをするだけ。というわけで、該当のメニュを選択し、プロパティ「ShortCutKeys」にリターンキーを設定。しようとしたのですが、プルダウンに出てこないのです!!!

あぁ「Return」じゃなくて「Enter」だきっとそうに違いないと思い、プルダウンを探しましたが見つからない。こうなったらローラー作戦。ということで上から下まで1つづつチェック。しかしプルダウンに存在しないのです。

仕方がないので、コード上でShortCutKeysを設定問題なく動作しました。「リターンキーは推奨されていないんだ。きっと。」と思いあきらめようとしたのです、なんとなくプロパティを見てみると、なんとテキスト編集できるではないですか。で、「Ctrl+Enter」とテキストを入力すると、設定できました。
そして正しく?動作しています。なんで「Enter」が選択できないのかは不明です。

同じ設定をVS2005/VS2008の両方で試しましたが同じようにプルダウンからは選択できないようです。
不思議ですねぇ。

あと、単に「Enter」と入力するとエラーになります。当たり前といえば当たり前ですね。

2008年8月25日月曜日

[他]AnkhSVN 2.0(その2)

GDD Blog: [他]AnkhSVN 2.0で外部diffが動かない。と書きましたが、今日試してみると普通に動作していました。

んーよくわかりませんが、VSまたはマシン再起動で反映された感じでしょうか。

2008年8月21日木曜日

[他]AnkhSVN 2.0

久しぶりにAnkhSVNのサイトを除いてみると、なんとバージョンアップして2.0になっていました。
UIがだいぶ変わています。ちょっと使いやすくなった気がします。

しかし、外部のDiffプログラムを設定しても正しく動作しないんです。何ででしょう。。。

後は日本語化を誰かがやってくれればたすかるんですけどねぇ。

2008年8月15日金曜日

[.NET]??演算子(その2)

先日??演算子についてBlogに書きましたが、その説明ページにもっと衝撃的なことが。
なんと、int型でもnull値を許容させることができるようなのです。
null 許容型 (C# プログラミング ガイド)に詳しい説明が。で、こんな感じ。

intnum = null;


型の後ろに?って書くだけでnullをセットすることができるようなのです。でサンプル書いてみました。

inthoge = null;
System.Diagnostics.Debug.WriteLine("1. hoge == null " + (hoge == null));
System.Diagnostics.Debug.WriteLine("2. hoge.HasValue " + hoge.HasValue);
System.Diagnostics.Debug.WriteLine("3. hoge= " + hoge);
hoge = 1;
System.Diagnostics.Debug.WriteLine("4. hoge.HasValue " + hoge.HasValue);
System.Diagnostics.Debug.WriteLine("5. hoge= " + hoge);


で、実行結果は以下のとおり。
1hoge == null True
2hoge.HasValue False
3hoge
4hoge.HasValue True
5hoge1


DAOっぽいクラスのインタフェースなど、意外と用途はあるかもしれません。

2008年8月14日木曜日

[.NET]??演算子

先日、コードレビューをしていると、不思議な記述を見つけました。コードはこんな感じ。

string hoge = null;
string hage = hoge ?? "hogehoge";


左辺がnullの場合右辺の結果を返す演算子のようです。三項演算子を用いる場合の特定条件で使えそうですね。

2008年8月9日土曜日

[.NET]MouseWheelイベントのインプリメント(つづき)

GDD Blog: [.NET]MouseWheelイベントのインプリメントでは、イベントのインプリメントの仕方を書きましたが、今回はその引数である、MouseEventArgsについて書きます。

先日実装した機能では、コントロール+ホイールで表示している画面の縮小拡大をし、コントロールを押していない場合は、スクロールさせるという機能を実現する必要がありました。
しかし、コントロール+ホイールで縮小拡大するのですが、同時に画面がスクロールしてしまうのです。

キー押下イベントでは、Handledというプロパティにtrueを設定すると上位コンテナ?にイベントがわたらないのですが、残念ながらMouseEventArgsにはHandledプロパティはありません。
で、MouseWheelの引数の型をよく見ると、HandledMouseEventArgsというクラスでした。プロパティには、Handledがありました。

キャストしてHandledにtrueを設定するとキーイベント同様に上位コンテナ?にイベントは通知されませんでした。めでたくコントロール押下+ホイールで拡大のみを実現できました。

わかってみると1行のコードなんですが、ここにたどり着くまでに3日費やしました。重たい1行でした。

2008年8月5日火曜日

[.NET]MouseWheelイベントのインプリメント

VB.NETでは違うのかもしれませんが、C#ではMouseWheelイベントをGUI(プロパティのイベント(イナズマボタンのアレ))からスケルトン?を作ることができません。理由はよくわかりません。

でも、コードエディタ上で、「panel1.MouseWheel +=」まで書けば、後はタブキーを2回押下することによりイベントのスケルトンを作ることができます。実装はこんな感じ

private void Form1_Load(object senderEventArgs e)
{
    panel1.MouseWheel += new MouseEventHandler(panel1_MouseWheel);
}

void panel1_MouseWheel(object senderMouseEventArgs e)
{
    //ホイールの処理
}

2008年8月4日月曜日

[他]レガシーASP(.NETではない)でのログ出力技

先日、レガシーASPの調査をしていました。調査のためにhtmlのコメント行をResponse.Writeするという常套手段をとっていました。
で、関係ないことを調べていると、「Response.AppendToLog」というメソッドが存在することがわかりました。このメソッドはIISのログにメッセージを出力するというものなんですが、IISのログ出力設定?の「URIクエリ」をチェックしておく必要があります。
何らかの理由でコメント行が出せない場合など、便利です。ただ、HTMLエンコードされてしまうので、出力するのは、英数字が吉です。

2008年8月1日金曜日

[他]プロジェクトの更新に失敗しました。フォルダ情報をサーバーから取得できません(ASP.NET)

私の所属している会社では、ソース管理にSVNを利用しています。しばらく前の話ですが、ASP.NETのプロジェクトもSVNで管理していたのですが、プロジェクトを開くたびに、「プロジェクトの更新に失敗しました。フォルダ情報をサーバーから取得できません。」というエラーメッセージが表示されていました。


当初1つだったASP.NETのプロジェクトも機能ごとに分割したり、テストツール用のプロジェクトに分けたりしました。で、数個のプロジェクトを1つのソリューションで管理する構成となったのですが、そのソリューションを開くと、そのソリューションに所属するASP.NETプロジェクトを開くたび、ダイアログが出てきてイライラしていました。


まぁそれはそれで我慢していたのですが、不可解な現象が出たときに「もしかしてコレのせい?」と疑心暗鬼になったりしました。で、調べてみると、VS.NETは関係がなくて、SVNの問題ということがわかりました。


私はTortoiseSVNを日本語化して使っているのですが、エクスプローラを右クリックし


 「TortoiseSVN」→「設定(S)」→一般タブの「".svn"ディレクトリの変わりに"_svn"を利用する」にチェック


後は適当なツールでフォルダ名「.svn」を「_svn」に変更。結構たくさんある。修正するとソリューションを開くたびに出ていたエラーメッセージも出なくなりました。

なんとなく拍子抜けした感じになります。。。