Eine der besten Möglichkeiten, dies zu erreichen, besteht darin, verschiedene Build-Konfigurationen in Ihrem Projekt zu erstellen:
<PropertyGroup Condition=" '$(Framework)' == 'NET20' ">
<DefineConstants>NET20</DefineConstants>
<OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Framework)' == 'NET35' ">
<DefineConstants>NET35</DefineConstants>
<OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>
Und in einer Ihrer Standardkonfigurationen:
<Framework Condition=" '$(Framework)' == '' ">NET35</Framework>
Was den Standard festlegen würde, wenn er nirgendwo anders definiert wäre. In diesem Fall erhalten Sie mit OutputPath jedes Mal, wenn Sie eine Version erstellen, eine separate Assembly.
Erstellen Sie dann ein AfterBuild-Ziel, um Ihre verschiedenen Versionen zu kompilieren:
<Target Name="AfterBuild">
<MSBuild Condition=" '$(Framework)' != 'NET20'"
Projects="$(MSBuildProjectFile)"
Properties="Framework=NET20"
RunEachTargetSeparately="true" />
</Target>
In diesem Beispiel wird das gesamte Projekt neu kompiliert, wobei die Framework-Variable nach dem ersten Build auf NET20 gesetzt wird (beide kompilieren und davon ausgehen, dass der erste Build das Standard-NET35 von oben war). Für jede Kompilierung werden die bedingten Definitionswerte korrekt festgelegt.
Auf diese Weise können Sie sogar bestimmte Dateien in der Projektdatei ausschließen, wenn Sie die Dateien nicht #ifdef müssen:
<Compile Include="SomeNet20SpecificClass.cs" Condition=" '$(Framework)' == 'NET20' " />
oder sogar Referenzen
<Reference Include="Some.Assembly" Condition="" '$(Framework)' == 'NET20' " >
<HintPath>..\Lib\$(Framework)\Some.Assembly.dll</HintPath>
</Reference>