Visual Studioにも、マクロが搭載されているのは当然というべきでしょう。MS Officeでも、ほぼすべてと言ってよいほどの操作がマクロで実行できたのですから、ましてやそれ以上にプログラマが扱うソフトウェアたるVisual Studioでできないわけがありません。というわけで、ちょっと試してみました。それにしてもGoogleの検索しても日本語の情報が(MSDNライブラリを除いて)まったくといって良いほど見当たらないのが意外です。Excelなんか山ほどあるというのにです。

とりあえず、何かやろうと思い、ビルドする度にTwitterへ投稿を一言行うという、読む側からすればはた迷惑そうなものを作りました。迷惑そうと言っても、気に入らなければスルーもしくはリムーブしてくださいというのがTwitterというものですし、問題ないでしょうという考えで作りました。


マクロ編集を行うウィンドウを呼び出すキーボードショートカットはAlt+F11でMS Officeと同じです。メニューからはツール→マクロ→マクロIDEで呼び出せます。

言語はMS Officeと異なりVisual Studio本体で取り扱えるものと同じバージョンのVisual Basic .NETのようです。以下のコードはVisual Studio 2008 SP1とVisual Studio 2010 β2ならびにRCで実行させています。

まず、EnvironmentEventsモジュールに次の関数を追加します。

1
2
3
4
5
6
Public Module EnvironmentEvents
  Private Sub OnBuildBegin( _
      ByVal Scope As vsBuildScope, ByVal Action As vsBuildAction) Handles BuildEvents.OnBuildBegin
    Module1.TwitteOnBuild()
  End Sub
End Module

Handles節により、BuildEvents.OnBuildBeginイベントが発生するとこの関数が呼ばれます。
ここに直接やりたいことを書いては綺麗ではないなと思ったので、TwitteOnBuildという関数を別に用意し、それを呼ぶ形にしました。System.Web.dllを参照設定に加えておいてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Public Module Module1
  Public Sub TwitteOnBuild()
    Try
      System.Net.ServicePointManager.Expect100Continue = False
      Dim slnName = Path.GetFileNameWithoutExtension(DTE.Solution.FullName)
      'Dim env = DTE.DTE.Name & " " & DTE.DTE.Version
      Dim msg = "ソリューション" & _
        Char.ToUpperInvariant(slnName(0)) & slnName(1) & _
        "をビルド (" & DateTime.Now.ToString("T") & ")"
 
      Using wc As New WebClient
        wc.Encoding = Encoding.UTF8
        wc.Credentials = New NetworkCredential("ユーザ名", "パスワード")
        Dim query = "https://twitter.com/statuses/update.xml?status=" & _
          HttpUtility.UrlEncode(msg)
        wc.UploadData(query, dummy)
      End Using
    Catch e As Exception
      Dim msgPath = Path.Combine( _
        Path.GetTempPath(), "ExceptionInVSMacro.txt")
      File.AppendAllText(msgPath, e.ToString() & Environment.NewLine)
    End Try
  End Sub
 
  Private dummy(0) As Byte
End Module

Module1を追加し、このような関数を加えました。BASIC認証は廃止になるから、OAuthやXAuthを使いなさいという話をよく耳にしますね。このコードもそのうち移行したいと考えています。

基本的にはDTEオブジェクトからありとあらゆるオブジェクトを獲得できると考えれば良いようです。ここでは、DTE.Solution.FullNameで現在開いているソリューション名を取得しています。このうち頭2文字を投稿文字列msgに含めています。それができたら、関数後半のWebClientを用いているところは、見ての通り普通のVB.NETプログラミングです。なお、よい子のみんなは、このようにコード中にパスワードを直接書かないようにしましょう。これで私が現在実際に用いているコードの完成です。

今後の改良予定としては、投稿部分を別プログラムに切り出し、パスワード管理をきちんとする、エラーの個数などをついでに投稿するなどといったことを考えています。

ここでは、イベントで動作開始するマクロを作成しましたが、MS Office同様、好きなときにユーザが呼び出せる形式のマクロも作成可能なようです。今回は取り扱いませんでした。

参考: Visual Studio のオートメーションおよび機能拡張


スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual Studioのマクロを使ってみた