読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

VS2010で複数のバージョンのフレームワーク対応のライブラリを作る

本日、ほぼ同じソースのファイルのプロジェクトを.NET Framework 4向けと.NET Framework 3.5向けの両方のアセンブリを作る必要が発生しました。
最初は一つのソリューション・一つのプロジェクトをMSBuildでどうにかしようか等と思っていたのですが、挫折。しかしメンテの手間は最小限にしたいのでどうしようか…と思案していたら、@さんからアドバイスをいただきました。



ということで、さっそくやってみました。

1.空のソリューションを作る

まず、空のソリューションを作ります。
プロジェクトの新規作成ダイアログにて、[その他のプロジェクトの種類]の中にある『空のソリューション』を選択し、適当にソリューション名を入力して作成します((VSの設定によっては若干変わるかもしれません。)。とりあえず今回はMyClassLibにしてみました。


2.「.NET Framework 3.5」向けのプロジェクトを追加する

.NET 4向けと3.5向けどちらでもいいのですが、基準になるプロジェクトを追加します。

2.1.プロジェクトダイアログを表示



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にしてみました。

3.2.アセンブリ名とルート名前空間を調整

同様に、アセンブリ名とルート名前空間を調整します。こちらも先ほどの3.5用と同様で、アセンブリ名はどちらもよいですがルート名前空間は合わせるほうが良いでしょう。今回は両方とも「MyClassLib」とします。

3.3.ソースファイルを「リンクとして追加」する

ここが今回の肝の部分となります。
まず、不要な「Class1.cs」を削除しましょう。その上で[追加]−[既存の項目]から、既存ファイルの追加ダイアログを表示します。

そして、.NET 3.5用のライブラリ「MyClassLib.35」の中のCalc.csを選択し、[リンクとして追加]を実行します。


成功すると、リンクとして追加されます。ソリューションエクスプローラで確認すると、ソースファイルにショートカットのようなアイコンが表示されているのが確認できると思います。


まとめ

以上で終了で、あとはソリューションをビルドすればそれぞれの成果物として適切なターゲット向けのアセンブリが出来あがります。もし共有できないソースが有るのであれば、それのみをそれぞれで実装すればよいわけですし、ちょっとしたら差分であればひょっとしたらpartial classで実装するのもアリかもしれません。

なお、テストクラスを実装する場合はこれもそれぞれのターゲットフレームワーク向けのテストプロジェクトを追加する必要があると思います(テストクラスについても共有できる部分は共有可能だと思います)。


最後になりましたが@さん、アドバイスいただきありがとうございましたm(__)m

*1:本題とは関係ないので中身は真面目に実装してませんが