64bit Windows7 上の Visual Studio 2008 で BandObjects2.0 をビルドする

BandObjects とは IEツールバーを簡単に開発するためのなにかです。

ぐぐるといろいろと情報が出てきますが、古い情報が多すぎます。しかし、これは古い情報が悪いんじゃなくて、MS製品の仕様変更が激しすぎるのが原因なので、情報を提供してくれている人を叩いてはいけません。このエントリも数ヶ月後にはゴミになってる可能性があります。悲しい。

入手

http://www.codeproject.com/KB/cs/BandObjects20.aspx

とりあえずここからソースを落としてきます。ユーザ登録が必要です。

多くの記事では Extending Explorer with Band Objects using .NET and Windows Forms - CodeProject を紹介していますが、情報が古すぎました。しかも、http://www.codeproject.com/csharp/dotnetbandobjects.asp こっちのアドレス404なんですけど。とりあえず古いBandObjectsを最近のVisual Studioで使うにはいろいろ改修が必要らしいし、Visual Studioの意味不明な仕様を勉強しても不毛なので、上のBandObjects2.0を落としてくると楽です。

ダウンロードしたzipファイルを解凍してソリューションを開くと、VS2005からVS2008への自動変換が行われます。VMなどを使っている場合は、Windowsコマンドプロンプトが共有ディスクにアクセスできないため、ローカルディスクへ保存しておくと後々楽です。

問題1: gacutil がない

ビルドを実行すると、.dll自体はできあがるのですが、ビルド後に問題が発生します。まず、gacutil.exeというファイルが見つかりません。これは、ビルド後に実行されるビルドイベントのところで

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if BandObjectsExample.dll

としているためです。Visual Studio 2008 を使っているので、パスを変更する必要があります。しかし、64bit Windows7 だからなのか、VS2008 だからなのかわかりませんが、Visual Studioディレクトリに gacutil が見あたりません。

このページによると、

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil"

Windows Server 2008 & Visual Studio 2008 ではここにあるそうです。64bit Windows7 でもここにありました。パスがわかったので、ビルド後のイベントを次のように書き換えます。

cd $(ProjectDir)bin\Release

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil" /if BandObjectsLib.dll
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil" /if Interop.SHDocVw.dll

cd している部分も Debug になってるので、 Release でビルドしたい場合は書き換えておきましょう(なんか環境変数っぽいのなかったっけこれ)。補足ですが、ビルドイベントは、プロジェクトのプロパティから設定可能です。

問題2: キャッシュにアセンブリを追加しているときにエラーが発生しました

パスの設定を変更すると

キャッシュにアセンブリを追加しているときにエラーが発生しました: アクセスが拒否されました。このタスクを実行するために必要な管理者の資格情報をもっていない可能性があります。

こういうエラーが起こります。簡単に解決するには、Visual Studioを右クリックし、管理者権限で実行するという方法が有効です。

これは、ここによると、gacutilを実行する際に管理者権限が必要だからだそうです。管理者でログインしていても、管理者権限付きで実行する必要があります。しかし、Windowsにはsudo的なコマンドがなさそうなので、gacutilを実行する Visual Studio を管理者権限で起動する必要がある、という感じです。

ビルドできた

上の問題2個を直したらとりあえずビルドはできました。ただ疲れたので実際にBandObjectsを使ってツールバーは作ってないです。なので、もしかしたら、他にもなんかしないとBandObjectsを利用できないかもしれないです。また問題が発生したら報告しようと思います。