いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

MSBuildにてC#3.0のコードをコンパイルする。

.NET Framework3.5のリリースと共にMSBuildもバージョンが上がっています。
その際に、今までのcsprojファイルだとC#3.0用のcscコンパイラが使用されません。
C#3.0のコードをコンパイルするには、既存のビルドファイルの以下の点を変更します。


  1. project要素にToolsVersion属性を追加する。
    • 値は、3.5を指定します。
  2. プロパティTargetFrameworkVersionを追加する。
    • 値は、v3.5を指定します。
  3. Framework3.5で追加されたDLLに関しては、Reference指定の際にRequiredTargetFramework要素を子要素として指定する。
    • 値は、3.5を指定します。
  4. 共通ターゲットファイルをインポートしている場合は($MSBuildBinPath)を$(MSBuildToolsPath)に変更する。
  5. WinFx用の共通ターゲットファイルは、Microsoft.Commons.targets内にて自動的にバージョンを見て読み込まれるのでいらない。

これでとりあえずビルドできるようになります。


以下、サンプルビルドファイルです。

<?xml version="1.0" encoding="utf-8"?>
<!-- vim:set ts=4 sw=4 et ws is nowrap ft=xml: -->
<!--

    サンプルプロジェクト用ビルドファイル

    共通ターゲットファイルは、以下の場所にある。
        ${.net frameworkインストールフォルダ}の下

    vimから利用する場合は、以下のようにして実行する。
        :!msbuild /t:Build,Run /p:TargetClass=クラス名

    作成されたEXEファイルは以下のようにして実行する事が出来る。
        $ GsfSamples.exe Gsf.Samples.Tmp.対象クラス名

 -->
<!-- 利用するツールバージョンは3.5のものを利用するよう設定. -->
<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">


    <!--
        共通プロパティの設定.
    -->
    <PropertyGroup>
        <!-- アセンブリ名 -->
        <AssemblyName>GsfSamples</AssemblyName>
        <!-- 出力形式 -->
        <OutputType>winexe</OutputType>
        <!-- ルート名前空間 -->
        <RootNamespace>Gsf.Samples.Tmp</RootNamespace>
        <!-- 最低限要求される.NET Frameworkのバージョン -->
        <MinFrameworkVersionRequired>2.0</MinFrameworkVersionRequired>
        <!-- ターゲットとする.NET Frameworkのバージョン -->
        <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
        <!-- デバッグタイプ -->
        <DebugType>full</DebugType>
        <!-- シンボルの定義 -->
        <DefineConstants>DEBUG;TRACE;GSF</DefineConstants>
    </PropertyGroup>

    <!-- 
        実行するエントリポイントクラスの指定 

        TargetClassプロパティは、コマンドラインより渡される。
        指定されていない場合は、既定のダミークラスを使用する。
    -->
    <PropertyGroup>
        <TargetClass>DummyClass</TargetClass>
    </PropertyGroup>

    <!--
        Runターゲット内にて使用されているプロパティの設定.
    -->
    <PropertyGroup>
        <!-- 実行時の引数 -->
        <StartArguments>$(RootNamespace).$(TargetClass)</StartArguments>
        <!-- アプリケーション内での作業ディレクトリ -->
        <StartWorkingDirectory></StartWorkingDirectory>
    </PropertyGroup>

    <!--
        コンパイル系のターゲットにて利用されている項目の設定.
    -->
    <ItemGroup>
        <!--
            参照設定.
        -->
        <Reference Include="System"/>
        <Reference Include="System.Core">
            <RequiredTargetFramework>3.5</RequiredTargetFramework>
        </Reference>
        <Reference Include="System.Data"/>
        <Reference Include="System.Data.DataSetExtensions">
            <RequiredTargetFramework>3.5</RequiredTargetFramework>
        </Reference>
        <Reference Include="System.Drawing"/>
        <Reference Include="System.Drawing"/>
        <Reference Include="System.Transactions"/>
        <Reference Include="System.Windows.Forms"/>
        <Reference Include="System.Xml"/>
        <Reference Include="System.Xml.Linq">
            <RequiredTargetFramework>3.5</RequiredTargetFramework>
        </Reference>
        <Reference Include="PresentationCore"/>
        <Reference Include="PresentationFramework"/>
        <Reference Include="WindowsBase"/>
    </ItemGroup>
    <ItemGroup>
        <!--
            コンパイル対象.
        -->
        <Compile Include="*.cs"/> 
    </ItemGroup>

    <!--=====================================================================-->
    <!-- 共通ターゲットファイルの読み込み.                                   -->
    <!--=====================================================================-->
    <!--
        以下v3.5用の設定.
    -->
    <!-- C#用の共通ターゲット定義ファイル.(内部でCommon定義ファイルが読み込まれている.) -->
    <!-- 同時にTargetFrameworkVersionの値が3.0以上の場合はWinFX用の共通ターゲット定義ファイルも読み込まれる. -->
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    <!--
        以下v2.0用の設定.
    -->
    <!-- C#用の共通ターゲット定義ファイル.(内部でCommon定義ファイルが読み込まれている.) -->
    <!--<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />-->
    <!-- WinFX用の共通ターゲット定義ファイル. -->
    <!--<Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" /> -->

</Project>


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。