とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

カテゴリ:Visual Studio の記事一覧

PInvoke.net Visual Studio Extensionを使ってみた

PInvoke.net Visual Studio Extension

.NETからWindows APIなどのアンマネージコードを利用する場合は
プラットフォーム間の型が違うために方の統一をしてやる必要がある。

それをCOM相互運用や、マーシャリングなどと言い、それが非常に面倒な呼び出しであることは
以前の記事で記載したとおりです。
C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)
C#からC++DLLを呼び出してマーシャリングの動きを確認した(中編)
C#からC++DLLを呼び出してマーシャリングの動きを確認した(後編)

API関数を呼び出す場合は、API関数の型や構造体を.NET側で利用できるように
定義していく必要があります。

Visual Studioで開発を行っている場合は
PInvokeが公開している「PInvoke.net Visual Studio Extension」を使うことで

この面倒な作業をほぼ解消することが可能なようで
実際にアドオンをインストールして使ってみました。

20140723_pinvoke02.png

20140723_pinvoke03.png

非常に便利。
使いたい関数を検索するだけで、C#側の定義を作成してくれました。

ただ、VB.NETを使っている場合はAny型で定義されてしまうこともあるらしく
Any型はアンマネージドコードとは相互変換できないために本当に使える型を探す必要があるようです。

Extentionを導入する方法は、PInvoke.net Visual Studio Extensionのサイトからインストールするか、
Visual Studioの拡張機能マネージャーから行うことができます。

ApiViewer:PInvokeアドオンを使わない場合


上記はVisual Studioのアドオンであるため、それ以外の開発環境の場合は
やはり不便です。

同様の機能が欲しい場合は「ApiViewer」というツールがおすすめ。
インストールが必要なため、持ち運びは難しいですが、
PInvoke.net Visual Studio Extension同様にAPI定義の検索ができます。
apiviewer
C#で利用する場合はOptionからC#を選択しておくことを忘れずに。




【.NET】継承フォームのデザイナ表示時に例外が発生する【form】

VisualStudioでデザイナの表示ができない
に関連していますが、デザイナ表示関連で注意点。

デザイナ表示時にコンストラクタが動く


継承Formやコントロールを使っていると、時々デザイナが表示できない場合がある。
20121220_51pageException2.png

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

【Visual Studio】シンボルの検索結果をすべて取得(コピー)する方法

いつぞやリンクが切れてしまうかもしれないので、引用します
VisualStudioのマクロから"シンボルの検索結果"の一覧を取得したい

やりたいことは、「すべての参照の検索」を実行することで表示される
シンボルの検索結果をすべて選択してコピーすること。
シンボルの検索結果って、なんで全部選択できないん!?
標準機能でできるならそれでいいんだけれど・・・

やりかたは、
マクロを保存して、実行するだけ。

ツール>マクロ>マクロエクスプローラを開く
vsmacro1.png

マクロエクスプローラ上で、適当なモジュールを追加
vsmacro2.png

で、以下の引用コードを貼り付け

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics


Public Module Test2
Public Sub Test2()

Dim sb As New System.Text.StringBuilder()
For Each s As String In FindSymbol2.GetAllReferencesSymbolsText()
sb.AppendLine(s)
Next

'ファイル出力
System.IO.File.AppendAllText("C:\symbol.txt", sb.ToString())

End Sub
End Module

Friend Class FindSymbol2
''' エディタの選択位置での「すべての参照の検索」の結果を取得してみる
Shared Function GetAllReferencesSymbolsText() _
As System.Collections.Specialized.StringCollection

Dim retval As New System.Collections.Specialized.StringCollection()

Dim activeWindow As EnvDTE.Window = DTE.ActiveWindow
If DTE.ActiveDocument Is Nothing Then
'Throw New Exception("実行するにはソースコードを表示して選択する必要があります。")
System.Windows.Forms.MessageBox.Show("実行するにはソースコードを表示して選択する必要があります。")

ElseIf Not TypeOf DTE.ActiveDocument.Selection Is TextSelection Then
System.Windows.Forms.MessageBox.Show("実行するにはソースコードを選択する必要があります。")

Else
DTE.ActiveDocument.Activate()

Dim sel As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection)
Dim pointTop As Integer = sel.TopPoint.AbsoluteCharOffset
Dim pointEnd As Integer = sel.BottomPoint.AbsoluteCharOffset
Dim windowFindResult As EnvDTE.Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindFindSymbolResults)
Dim canCopy As Boolean = True

DTE.ExecuteCommand("Edit.FindAllReferences", String.Empty)
windowFindResult.Activate()
Try
DTE.ExecuteCommand("Edit.Copy") '結果がないとエラーをはく?
Catch ex As System.Runtime.InteropServices.COMException
canCopy = False
End Try
If (canCopy) Then
Dim strStart As String = GetClipboard()
Dim str As String = strStart
Do
retval.Add(str)
DTE.ExecuteCommand("Edit.GoToNextLocation")
windowFindResult.Activate()
DTE.ExecuteCommand("Edit.Copy")
str = GetClipboard()
Loop While strStart <> str
End If

activeWindow.Activate()
sel.MoveToAbsoluteOffset(pointTop)
sel.MoveToAbsoluteOffset(pointEnd, True)
End If

Return retval
End Function

Private Shared Function GetClipboard() As String
Dim start As New System.Threading.ParameterizedThreadStart(AddressOf GetClipboardText)
Dim thread As New Threading.Thread(start)
thread.ApartmentState = Threading.ApartmentState.STA
Dim param(0) As String
thread.Start(param)
thread.Join()
Return param(0)
End Function

Private Shared Sub GetClipboardText(ByVal param As Object)
Dim s As String() = DirectCast(param, String())
s(0) = System.Windows.Forms.Clipboard.GetText()
End Sub

End Class

ペロッとな。
※完全な引用じゃなくて申し訳ないんだけど、txtファイルに出力するようにしています。
だもんで、メソッド名の後ろに「2」って書いてます。

vsmacro3.png
そんで、Test2()メソッドをコソコソと実行してやれば、
'ファイル出力 ってコメントのところで指定した場所にファイルができあがります。

しかしだ、実はこのマクロ、すぐに落ちます(笑)
そりゃあ、無理やり「↓」ボタンのキーコード等を送りつけてるんだから仕方ないわな。

機嫌良く動かすには以下の取り扱いが必要。

Visual Studio上で、すべての参照を行いたいシンボルにカーソルを当てる。
右クリックして「すべての参照を検索」するわけではないので注意ねw
あくまでもカーソルを当てるだけ。

で、マクロエクスプローラ上から、Microsoft Visual Studio Macros を開けるので
test2にカーソルが当たっている状態で「マクロの実行」を行う

vsmacro4.png

緑色の右に向いた三角のアイコンを押せばいいよ。

「この状態で放置!」

これ大事!!!
なんせ、裏技っぽく下矢印キーコードを送りつけてるもんだから、他のウィンドウを消したり出したりしてると
動きが・・・ぐぬぬぬ。

不便?
でもどうせこんなもんをコピーしたい時って調査資料を作ったりする場合だけでしょ?

だったらジッと待ってなさい!!!!

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】"&"(アンパサンド)が表示できない【C#】

C#のLabel(ラベル)コントロールに"&"を記載すると
画面表示時に"&"が表示されない・・・
C#での文字列操作において、エスケープシーケンスは"\"のはず。
というわけで、久々にハマった。

レガシーなwindowsアプリなんてほとんど作らないからすっかり忘れてたというか、
念頭になかったけど、ニーモニックキーが原因なんだね。

「& 表示されない」とか、「C# アンパサンド 表示」とか変なググり方をしてしまったけど
結果的にはニーモニックキーを無効にすることで回避できる。

Label UseMnemonicプロパティ

ちなみに、labelコントロールにフォーカスすることができない(TabStopプロパティがない)のに、
TabIndexプロパティがある理由は、ニーモニックキーがあるかららしい。

DOBON.NETプログラミング掲示板過去ログ > ラベルにタブ移動したい

Label に ファイル名(&N) としておいて、[Alt] + [N] キーを押下すると、
その次の TabIndex にあたるフォーカスを取得できるコントロールへフォーカス遷移します。

たいていの場合は、Label + TextBox の関係になっているため、
次の TextBox にフォーカスが移るわけですね。

これが、TabStop はなくて TabIndex がある理由です。

ということです。
深く調べると、.netのlabelコントロールはnative label (static) controlのラッパーだというところまで行ってしまうけど、ここでは割愛しますが、いろんな知識持っている人がいるんだなぁ。

MSDNフォーラム display ampercent (&) in label
A Compact Framework label is simply a small wrapper around a native label (static) control.


というわけで、もう一つの回避策としては、
アンパサンドをエスケープ("&&"と書く)することだね。

それにしても、せっかく原文のページを開きたいのに
勝手にGoogle翻訳に飛んでしまうブラウザの挙動を変更したい・・・

テーマ:プログラミング - ジャンル:コンピュータ

リソースファイルがソリューションエクスプローラ内でバラけて別れる(分裂する)

ソリューションエクスプローラでリソースファイルを作ってたのだけど、
リソースのresxファイルとDesignerファイルが統合しなくなり
添付画像のXAC999みたいに2ファイル分かれているように見えてしまうようになった。
本当は統合しているはずなのに、分離している感じ。

特に影響はないんだけど、とにかく気持ち悪い。

カスタムツール「ResXFileCodeGenerator」が何かやらかしたのか、それとも
VSSを使ってるもんだから読み取り専用属性となったファイルに対して悪さをしているのか。

原因は分からないけどプロジェクトファイルを修正しないと直らないのかなぁ・・・

統合しなくなったリソースファイル

問題の現象:
XAC998.resxはDesigner.csがファイル下に表示されているけど
XAC999は.resxとXAC999.Designer.csがバラバラ・・・・

内容確認のため、プロジェクトファイルをメモ帳か何かで開く。



なんでこうなったかはまだわかってないけど、
998の方に合わせて修正し、プロジェクトを再読み込み。

統合後のリソースファイル

とりあえず一安心!



テーマ:プログラミング - ジャンル:コンピュータ

次のページ

FC2Ad