本日、ほぼ同じソースのファイルのプロジェクトを.NET Framework 4向けと.NET Framework 3.5向けの両方のアセンブリを作る必要が発生しました。
最初は一つのソリューション・一つのプロジェクトをMSBuildでどうにかしようか等と思っていたのですが、挫折。しかしメンテの手間は最小限にしたいのでどうしようか…と思案していたら、@hidoriさんからアドバイスをいただきました。
@kiyokura VS2010 移行ならマルチターゲットが使えるので、1個のソリューションに仕向け別のプロジェクトを作って、共通のソースは最新版のプロジェクトのやつを「リンクとして追加」でどうでしょう? VS2008 以前だと、ソリューションを分けないとダメかも。。。
2012-08-23 17:00:53 via MetroTwit to @kiyokura
ということで、さっそくやってみました。
1.空のソリューションを作る
まず、空のソリューションを作ります。
プロジェクトの新規作成ダイアログにて、[その他のプロジェクトの種類]の中にある『空のソリューション』を選択し、適当にソリューション名を入力して作成します((VSの設定によっては若干変わるかもしれません。)。とりあえず今回はMyClassLibにしてみました。
2.「.NET Framework 3.5」向けのプロジェクトを追加する
.NET 4向けと3.5向けどちらでもいいのですが、基準になるプロジェクトを追加します。
2.1.クラスライブラリテンプレートを追加
[新しいプロジェクトの追加]等からダイアログを表示し、ソリューションに対してクラスライブラリのプロジェクトを追加します。
この時、フレームワークのバージョンに[.NET Framework 3.5]を選択し、プロジェクト名もそれっぽいのにしておきます(今回はプロジェクト名はMyClassLib.35としました)。
2.2.アセンブリ名とルート名前空間を調整
アセンブリ名とルート名前空間を調整します。
このままだと、アセンブリ名が「MyClassLib.35」、ルート名前空間が「MyClassLib._35」のようになります。アセンブリ名はお好みで良いと思うのですが、この後に一部のソースファイルを.NET 4用のプロジェクトと共有する必要があります。そのため、ルート名前空間は合わせておいたほうがよいと思います。
今回はアセンブリ名も同じにしたいと思いましたので、双方とも「MyClassLib」としました。
2.3.クラスを実装
実際に必要な機能を実装します。
既定で含まれているClass1.csを削除して実装します。今回はサンプルとして四則演算をするCalcクラスでも実装してみました*1。
とりあえず、ここまでで.NET 3.5向けのクラスの実装がひと段落したと仮定して、次のステップに進みます。
3.「.NET Framework 4」向けのプロジェクトを追加する
3.1.プロジェクトの追加
次に.NET 4向けのプロジェクトを追加します。先ほど3.5用のプロジェクトを追加したのと同様、今度はターゲットとして[.NET Framework 4]を選択し、プロジェクト名はMyClassLib.40にしてみました。
まとめ
以上で終了で、あとはソリューションをビルドすればそれぞれの成果物として適切なターゲット向けのアセンブリが出来あがります。もし共有できないソースが有るのであれば、それのみをそれぞれで実装すればよいわけですし、ちょっとしたら差分であればひょっとしたらpartial classで実装するのもアリかもしれません。
なお、テストクラスを実装する場合はこれもそれぞれのターゲットフレームワーク向けのテストプロジェクトを追加する必要があると思います(テストクラスについても共有できる部分は共有可能だと思います)。
最後になりましたが@hidoriさん、アドバイスいただきありがとうございましたm(__)m
*1:本題とは関係ないので中身は真面目に実装してませんが