ページ

2013-02-19

MSBuildからAssemblyInfoを生成する

結論から言うと、MSBuild Community TasksAssemblyInfoタスクを使えばできる。

おすすめじゃない方法

おすすめじゃないけど簡単な方法として、既存のAssemblyInfo.csを置き変えてしまう方法がある。
Community Tasksの.targetsをImportしたあと、以下の感じのターゲットを作れば、既存のAssemblyInfo.csを置き変えることができる。



しかし、この方法ではプロジェクトが複数あった場合に、プロジェクト別に値を設定することができない。
これを作ったあと、Community Tasks的におすすめな方法があることがわかった(雛形がある)。

おすすめの方法

ざっくり言うと、GlobalAssemblyInfo.csを作り、それを参照する。

1. GlobalAssemblyInfo生成ターゲットを作る

Community Tasksをインポート後、このようなターゲットを作る。


次のプロセスのために1回実行しておく。

2. GlobalAssemblyInfo.csをリンクとして追加する

各プロジェクトで、GlobalAssemblyInfo.csを追加する。Visual Studioからは、「追加>既存の項目...」で追加するが、
追加ボタンの右の▼を押して、リンクとして追加するのを忘れない。


3. 既存のAssemblyInfo.csから重複する値を削除する

GlobalAssemblyInfoに定義した値は、既存のAssemblyInfo.csから削除しておく。

これで、各プロジェクト個別の値をセットすることを可能にしつつも、バージョン等々をMSBuildから管理できるようになった。

GlobalAssemblyInfoの情報を取得する

アセンブリの情報は、リフレクションで取得することが可能だが、GetCustomAttributesが冗長な記述を要求したりして面倒。
しかし、AssemblyInfoタスクで、GenerateClass="true"にしておくと、「ThisAssembly」クラスを作ってくれる。
そのため、以下のようなシンプルな形でコードから情報を取得可能。

  string product = ThisAssembly.AssemblyProduct;

2013-02-09

PowerShellを使ってインストールされたファイルのパスからプロダクトを調べる

rpm -qf /usr/bin/hogehogeや、dpkg -S bin/hogehogeなどとしてファイルパスからどのパッケージに入っているのか調べることありますよね?そのWindows版です。

(残念ながら入れないといけないのですが)Windows Installer PowerShell Moduleをインストールして、トップページに書いてある通り、PowerShellから以下のように打てばOKです。
PS C:\> Import-Module msi
PS C:\> Get-MSIComponentInfo | where { $_.path -eq "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramew
ork\v4.0\System.dll" }  | Get-MSIProductInfo

ProductCode                            ProductVersion      ProductName
-----------                            --------------      -----------
{CFEF48A8-BFB8-3EAC-8BA5-DE4F8AA267CE} 4.0.30319           Microsoft .NET Framework 4 Multi-Targeting Pack

Windows Installer (msi) で入っていないものには使えないですが、参考になるかもしれません。

2013-02-06

MSBuild Launcher 0.1.0 リリース

最近またMSBuildをちょっと使うようになったので、MSBuild Launcherの新版をリリースしました。
  http://msbuildlauncher.codeplex.com/
githubダウンロード機能削除を受けて、これもCodeplexに移行です。

あと、プロパティ編集機能という大き目の機能がついたので、0.0.3ではなく0.1.0になりました。

MSBuildファイルの中のコメントに以下の感じのJSONを書くと、右側のペインにテキストボックスかコンボボックスが現れます。


本当はオレオレnamespaceを用意してオレオレ属性をプロパティのタグにつけたかったんだけど、そういうXMLファイルは食べてくれなかったので仕方なく。コメントの中にXMLが現れるとまたカオスなことになりそうなので、いっそJSONということでJSONになりました。

ちなみに上の「Common Properties」は実行ファイルと同じ場所にあるCommonProperties.jsonというファイルにJSONが書かれています(編集可能)。

これらのプロパティは、変更したものだけ(=右側のトグルボタンがオンになっているときだけ)ビルド時に指定されるようになっています。


あとは、似非Editボタン(.xmlに関連付いたプログラムを起動する)とか、既定のターゲットを実行するBuildボタンがついたりしました。

[2013/2/7追記]
いくつかバグってたので直して0.1.1を出しました。疑似Editボタンは、設定を用意してちゃんと(?)Editボタンになりました。

[2012/2/9追記]
MSBuild LauncherのビルドをMSBuildでやるようにした関係もあって、0.1.1はAnyCPUにしたんだけど、x64環境ではx86のアセンブリがロードできずに動かないケースがあるとのこと。 そりゃそうだ。ということで、0.1.2が出て、x86に戻りました。うざったいメッセージボックスもログウィンドウに出してうざくなくしたよ。