Visual C++ で .NET Framework を使用する際の注意点

Microsoft .NET Framework を使用したプログラミングを行う場合、特に制限がなければ C# なり VB.NET なり(最近は F# も?)を使用した方が良いと思うのですが、時には過去の資産(C++ のクラスライブラリ等)を利用する等の理由で C++/CLI を使用する事もあります。Visual C++ でビルドする場合、Visual C# 等に比べてターゲットフレームワークを変更する(「.NET Framework 2.0 向け」とか「.NET Framework 4.0 向け」とか)のが非常に難しく、どこかに文書を残しておかないと間違いなく忘れるのでメモしておきます。

尚、以下の記述は Visual C++ 2010 Express を使用した時のものです。

プラットフォーム ツールセットの変更

Visual C# 等では直球で「対象のフレームワーク」と言う項目が用意されているのですが、Visual C++ ではプロジェクトのプロパティ中の「プラットフォーム ツールセット」の設定を変更する事で対応します。

プラットフォーム ツールセットは、基本的には「.NET Framework 3.5 以前であれば v90 を、.NET Framework 4.0 以降であれば Windows7.1SDK を」選択すると覚えておけば良いかと思います。尚、追加でダウンロード/インストールが必要なものは以下の通りです*1

.NET Framework 3.5 以前 (x64) をターゲットにする場合

各種設定で一番分かりにくいのが、.NET Framework 3.5 以前 (x64) をターゲットにビルドする方法です。プラットフォーム ツールセットを Windows7.1SDK に設定すると *.vcxproj の設定に関わらず 強制的に .NET Framework 4.0 向けにビルドされます。一方で、v90 に設定してビルドすると以下のようなエラーが表示されます。

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\PlatformToolsets\
v90\Microsoft.Cpp.x64.v90.targets(35,5): error MSB8014: 実行パス
(C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\x86_amd64)
が見つかりませんでした。

このエラーは、Microsoft Visual Studio 2008 SP1 をインストールした後、さらに Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 をインストールする事で回避できます。この際、Windows7.1SDK のように新たなプラットフォーム ツールセットが登録されるのではなく、v90 用のフォルダに追加的にインストールされるようです。

Microsoft Visual C++ 再頒布可能パッケージ

.NET Framework を使用した C++ のプログラムをビルドする場合、静的リンク (/MT) を指定する事ができないので、実行環境に Microsoft Visual C++ 再頒布可能パッケージをインストールする必要があります。

ターゲットフレームワーク .NET Framework 3.5 以前の場合は「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ」を、.NET Framework 4.0 以降の場合は「Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ」をユーザにもダウンロード&インストールしてもらう必要があります。

…… のはずなんですが、何故か .NET Framework 3.5 以前をターゲットに指定してビルドした場合、Microsoft Visual C++ 2008 SP1 再頒布可能パッケージがなくても動く ようです。うっかりインストールされてるのかと思い、手元の環境でいろいろ試してみましたが問題なく動作しました。原因は不明です。

TargetFrameworkVersion

ターゲットフレームワークを変更する方法に関して「*.vcxproj の TargetFrameworkVersion タグで指定する」と言う記事もいくつか見つけましたが、手元で実験した限りでは機能しませんでした。具体的には、ツールセットを v90 に設定 TargetFrameworkVersion を 4.0 にした場合はビルドエラーとなり、ツールセットを Windows7.1SDK に設定して TargetFrameworkVersion を 2.0 にした場合は無視されました(強制的に 4.0 をターゲットにビルド)。

VB.NET Tips .NET Framework2.0から3.0,3.5へ変更するには? | GigasMegas にあるように 2.0〜3.5 の間で TargetFrameworkVersion を変更する時のみ有効なのかもしれません(詳細は不明)。

ビルドしたプログラムの確認

ビルドしたプログラムの対応状況(ターゲットフレームワーク等)を確認するには corflags と言うツールを使用すると良いようです。

D:\project\PDFLibNet\Release\x64>corflags PDFLibNet.dll
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32+
CorFlags  : 24
ILONLY    : 0
32BIT     : 0
Signed    : 1

Version の欄にターゲットとなる .NET Framework のバージョンが表示されます。また、PE の欄が PE32 であれば x86、PE32+ であれば x64 を表すようです。

*1:.NET Framework 4.0 以降 (x86) と言う構成でのみ、初期状態のまま追加ダウンロード無しでビルド可能です。この場合、プラットフォーム ツールセットは v100 となります。