VisualStudio 2010, 2008, 2005 のソリューション(.sln や .csproj など)を強引にコンバートするツールを作ってみた

作ったもの

  • SUtils.Development.VS.SolutionConverter.exe
    • .sln や .なんたらproj (.csproj や .vbproj など) をコンバートできる。
    • VS2010 の .sln などを VS2008 向けにコンバートしてビルド&動作までは確認
      • ただしいろいろと強引
      • 自分の使ってない VS の機能についても、それなりに大丈夫そうな気がするが、気がするだけである。
  • SUtils.Development.VS.FileFormat.dll
    • .sln のパーサーなど
    • VS2010 や VS2008、VS2005 のはき出す .sln を読み書き可能
      • アドオン(AnkhSVN とか)が付加する情報なども欠損せずに取り扱い可能

SolutionConverter.exe

VS2010 のソリューションから VS2008 のソリューションを機械的に作り出したかったので作った。
(自分の開発は VS2010 でやるが、VS2008 でもコードをいじれるようにしておく必要があったため。)

使いどころ


特に、

  • 同一のコードベースについて VS2010 と VS2008 版のソリューションとプロジェクトを用意したい
    • .cs や .vb といったコードは一つのファイルで、それを異なる VisualStudio 向けのプロジェクトから参照する
    • 上の画像のような感じに、同じフォルダに .sln や .なんたらproj が複数並ぶようにする
  • 新しい方の VisualStudio のソリューションから古い方の VisualStudio のソリューションを生成したい
    • アップグレードウィザードの逆
  • その他、VisualStudio の機能からはできない書き換えを、多少強引でも実行したい

という場合に使えるであろうツールである。

使い方

バイナリ: http://my-svn.assembla.com/svn/SToolsMirror/Development.VS.SolutionConverter
ソースコード: http://www.assembla.com/code/SUtils/subversion/nodes/trunk/CSharp/SUtils 以下

  • バイナリを落とす
  • SUtils.Development.VS.SolutionConverter.exe をたたく
    • SUtils.Development.VS.SolutionConverter.exe --help で簡易ヘルプが出る。

コマンドの例

SUtils.Development.VS.SolutionConverter.exe --sln=SUtils.sln --ver=vs2008 --fx=3.5

このように呼び出した場合、SUtils.sln ソリューションとそこから参照されているプロジェクトを全て読み込み、それらを

に変更して、SUtils.vs2008.sln などとして書き出す。

SUtils.Development.VS.SolutionConverter.exe は、VisualStudio (2005, 2008 or 2010) ソリューションファイルを読み込んで、VisualStudio (2005, 2008 or 2010) ソリューションファイルをはき出すことができる。
また、その際に、ソリューションから参照されているプロジェクトもコンバートし、プロジェクトの参照設定なども修正する。

注意点

当たり前だが、.net 4.0 にしかないメソッドや、.net 4.0 にしかないアセンブリ .net 3.x で使えるようになる!といったことは無理である。

そのため、コンバート先のフレームワークに存在しないメソッドなどは当然コンパイルエラーになる。
SolutionConverter.exe は、ビルド設定を書き換えて定数を追加 #define する機能がある(--const 引数で指定)ので、これを与えた上で、#ifdef を使う必要があるだろう。

// NET_3_x と NET_3_5 定数を追加で定義
// C# 側のコードでは、バージョン依存のコードを適宜 #ifndef NET_3_x なりでくくる。
SUtils.Development.VS.SolutionConverter.exe --sln=SUtils.sln --ver=vs2008 --fx=3.5 --const=NET_3_x,NET_3_5

また、VisualStudio がサポートしてない行為であるし、そもそも実現手段からして強引であるので、当然結果を保証できない。
大事なファイルに対して適用する場合は、バックアップなりを事前にとっておいた方が・・・。

マニアックな点

SolutionConverter.exe では、ほかにも以下の機能に対応している。

  • アセンブリ参照の強制削除(デフォルト: --refDel="System.Xaml, Microsoft.CSharp")
  • ファイル名の変換規則の変更(--slnFileName および --projFileName オプション)
    • SolutionConverter.exe が書き出す .sln や .なんたらproj のファイル名のパターンを変更する。
    • デフォルトは "{0}.{2}.{1}" (ファイル名.VSプロダクト名.拡張子)
    • String.Format のフォーマット文字列になっている。
    • ここを "{0}.{1}" (元のファイル名.拡張子) にすると、ファイルを上書きするようになる。
  • .sln に関連づけられたエディションの変更(--edi オプション)
    • 例えば、"Visual Studio 2010 に関連づけ" "Visual Basic Express 2005 に関連づけ" のように、エディションを変更できる。
    • "--edi=C#" や "--edi=Studio" のようにして指定。

SUtils.Development.VS.FileFormat.dll

ダウンロード元などは SolutionConverter.exe と同じ。
これの入っている SUtils は Apache ライセンスなので、ライセンスの範囲内でご自由にどうぞ。