HardLinkTaskを使用する
HardLinkTaskをMSBuildプロジェクトファイルに追加するには、最初にこのタスクをインポートしてビルドプロセスのスコープ内に置く必要があります。これにはUsingTask要素を使用します。
<UsingTask TaskName="HardLinkTask" AssemblyName = "HardLinkTask, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a912dca8b5fb92f0"/>
MSBuildでは.NETの標準アセンブリ読み込みインフラストラクチャが使用されます。つまり、タスクを実装したアセンブリをvcxprojビルドファイル内で指定するために、パスまたはGACに格納されたアセンブリへの完全修飾名を使用できます。前記の例では、GACによる指定を使用しています。
タスクをMSBuildコマンドラインから直接呼び出すことはできません。Target要素内にネストする必要があります。1つのTarget要素に複数のタスクを指定できますが、今回はカスタムタスク作成のデモが目的なので、HardLinkTaskのみをTarget要素に指定します。
<Target Name="CreateHardLink">
<HardLinkTask
SourceFileName="$(HardLinkSource)"
TargetFileName="$(HardLinkTarget)"/>
</Target>
パズルの最後のピースとして、PropertyGroup要素を追加します。この要素には、タスクに渡す必要があるプロパティを格納します。
<PropertyGroup> <HardLinkSource>C:\source.txt</HardLinkSource> <HardLinkTarget>C:\destination.txt</HardLinkTarget> </PropertyGroup>
このターゲットを実行するには、コマンドラインからMSBuildを呼び出し、/tスイッチを使ってターゲット名を指定します。
msbuild MyApp.vcxproj /t:CreateHardLink
まとめ
MSBuildカスタムタスクを使うと、任意のマネージドコードをビルドプロセスの一部として実行できます。C++/CLIは、ネイティブ機能を非常に簡単に利用できるようにするマネージド言語です。ネイティブAPIを通してしか利用できない機能にアクセスするために、多くのカスタムMSBuildタスクが今後書かれるでしょう。C++/CLIはカスタムタスクを開発するための優れた言語です。
Windows SDKのCreateHardLink関数を使うと、ファイルへのハードリンクを作成できます。ハードリンクは、既存のファイルを指す追加のディレクトリエントリであり、仮想的なコピー操作を実行できます。ハードリンクMSBuildタスクをC++/CLIで作成する手順は簡単です。リンク元とリンク先のファイル名が格納された2つのプロパティを取得し、それらを変換してCreateHardLink呼び出しに適した文字列データ型にしてから、このメソッドをExecuteメソッドの実行中に呼び出します。タスクが完成し、コンパイルが終了したら、MSBuildファイルターゲットにタスクを追加してビルドプロセス中に使用できます。
