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 ソリューションとそこから参照されているプロジェクトを全て読み込み、それらを
- Visual Studio 2008 向け
- .net framework 3.5 をターゲット
に変更して、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")
- 特定のアセンブリへの参照を抹消する。
- デフォルトでは、上記二つの、.net framework 4.0 にしかないアセンブリを参照から消す。
- ファイル名の変換規則の変更(--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 ライセンスなので、ライセンスの範囲内でご自由にどうぞ。