2008/08/29(Fri)Visual Studio 2005 と 2008 の共存環境

はてブ数 2008/08/29 4:33 計算機な日記::ボクと計算機 つーさ

VS2005と2008を両方入れてみた。

20080829050114.png

というのは、VS2008で作ったプロジェクトをVS2005で開けるようにしておきたいから。

我がGSDでは、開発環境としてそれぞれ個々人の購入したVSを使っているので、自分が2008を使い出すと2005と2008が混在してしまうのね。個人で使うなら2008だけでいいと思うんだけれど、多人数開発のときは問題出るだろうなぁと思って、今回は *.sln と *.??proj の 2005と2008における互換性を調べるために両方入れてみることにしたんでした。

……まぁ、まだ2008には「起動が早くていいね!」って利点しか見つけられてないし、ことによっては2005を使い続けることにして、OSのバージョンアップなんかしなくてよかったじゃんとかいうことになるかもしれないけれどω

なんか、VS2005のSR1が当たらないけどそれはさておき。

両方入ってる環境だと、ソリューションファイルをダブルクリックしたときは、ファイルのバージョンと適合するVSが立ち上がってくるっぽい。
適合するバージョンが入ってないと、新しいので開いて、アップグレードしますか、となるみたい。

とりあえず、 C#プロジェクトについて。

2005で作ったC#プロジェクトの入ったソリューションを2008で開いて、変換ウィザードでアップグレードしてからDIFFをとってみた。
.sln は頭の2行

-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008

(と、AnkhSVN関連の記述)

.csproj は頭の1行

-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">

(と、アップグレードされたことを表す旨の記述が増えてた)

が書き換わっただけっぽい。

アップグレードされたソリューションは、VS2005で読もうとしても新しいバージョンで作られたプロジェクトは読み込めないぜ、というエラーがでて開けないので、これでは困る。
というわけで、手作業でダウングレードしてみる。

とりあえず、後者csprojを放置して、前者のslnだけ、 10.00→9.00 2008→2005 と書き換えただけで、普通に .slnからVS2005が起動して普通に読み込めた。
お……。これは、SVNのpre-Commitと、post-Updateのフックスクリプトをちょっと書くだけで、あっさりいけるかも……。って印象。ただ、当然2008で追加されてる部分については対応できないというか、コードを書く上でも、個人開発ではバリバリ使いたいC#3.0のシンタクスシュガーが使えないことを考えるとちょっと涙目かも。てか、うっかり書いて部室持ってったらコンパイル通りませんとかやるだろうなぁω

追記、いったんVS2008でプロジェクトの設定を書き換えると、 が 8.0.50727 → 9.0.21022 になるとともに、TargetFrameworkVersion 他、いくつか項目が増える。
しかし、この状態でも、.slnを書き換えるだけでVS2005からも読めるし、VS2005でプロジェクト設定を書き換えても、先のProductVersionこそ戻るが、2008で増やされた項目を削除するなどの影響はないみたいだ。

C++プロジェクト

.vcprojのソリューションも試してみた。
まずアップグレード。

ローカルの IIS サーバーへの Web 配置はサポートされなくなりました。Web 配置ビルド ツールはプロジェクト設定から削除されました。
このアプリケーションは、Windows Vista のユーザー アカウント制御 (UAC) 機能に関連する設定を含むように更新されました。既定で、UAC を有効にして Windows Vista 上でアプリケーションを実行すると、起動したプロセスと同じ特権で実行するようにマークされます。このマークによって、アプリケーションの仮想化による実行も無効になります。プロジェクトのプロパティ ページから UAC 関連の設定を変更できます。

とか出てきた。
.vcprojファイルを開くと、各設定のリンカオプションに
RandomizedBaseAddress="1" (0=規定値 1=OFF 2=ON。VS2008のデフォルトは 2)
DataExecutionPrevention="0" (0=規定値 1=OFF 2=ON。VS2008のデフォルトは 2)
という属性値が書き足されたのと
<Tool Name="VCWebDeploymentTool" />
の項目が削除されたみたい。規定値って何……?ω

さておき、ダウングレード。
まず、.slnを書き換えてみる。
とりあえずVS2005が起動したものの、プロジェクトの変換ウィザードがでてきてしまい、かつ、新しいものから古いものへの変換はサポートしてないよ!(変換元として未サポート)的なエラーが出て変換に失敗し、プロジェクトのロードにも失敗。VCに関してはプロジェクトファイルもいじる必要があるみたい。

ポイントは .vcprojの4行目付近で、 Version="9.00" とあるところ。ここを Version="8.00" としたら普通に読み込むことができた。
読み込んだ状態でリンカオプションをいじると
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
は消滅してしまったので、同プロジェクトを2005と2008で行き来させる場合は注意が必要、かも。でも、HSPスクリにマシン語を埋め込む的な特殊なことをやってない限りはいずれもONでいいはずだから、消滅してしまった状態でもかまわないのかも。まぁ、予期せず書き換えられる場合がありますよってことだね。

というわけで、
コミット時は2008ソリューションを2005ソリューションに自動的にダウングレード
アップデート時は2005ソリューションを2008ソリューションに自動的にアップグレード
するフックスクリプトを書けそうなことがわかりました。後は簡単ですね!

追記、.vdprojについて。
アップグレード時には、 は変換されませんでしたと出ていたが、2008で作った.vdprojが2005で読み込めるかどうかは未検証。