msbuildassemblyinfo

How can I change AssemblyProduct, AssemblyTitle using MSBuild?


I have an MSBuild script which compiles my existing solution but I'd like to change some properties of one of the projects within the solution at compile-time, including but not limited to AssemblyProduct and AssemblyTitle.

Here's a snippet of my build script:

  <Target Name="Compile" >
 <MSBuild Projects="..\MySolution.sln" 
             Properties="Configuration=MyReleaseConfig;Platform=x86" />
  </Target>

I've got one main executable and several DLLs that are compiled. I am aware of the MSBuild Extension Pack and I suspect it might help me to get to where I need to be, although I'm not sure how to proceed.

Can I selectively change AssemblyInfo properties at build time?


Solution

  • You're on the right track with the MSBuild Extension Pack.

    I find the easiest way to conditionally generate the assembly details at build time is to add an "AssemblyVersion" target directly to my .csproj file(s) that require an updated AssemblyInfo file. You can add the target directly to each csproj file that requires an updated AssemblyInfo file, or as I prefer to do it, create a custom targets file with the AssemblyVersion target and have each csproj file include your custom targets file.

    Either way you likely want to use the MSBuild Extension Pack or the MSBuild Community Tasks to use their respective AssemblyInfo task.

    Here's some code from our build scripts:

    <!-- Import the AssemblyInfo task -->
    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets"/>
    
    <!-- Overriding the Microsoft.CSharp.targets target dependency chain -->
    <!-- Call our custom AssemblyVersion target before build, even from VS -->
    <PropertyGroup>
        <BuildDependsOn>
            AssemblyVersion;
            $(BuildDependsOn)
        </BuildDependsOn>
    </PropertyGroup>
    
    <ItemGroup>
        <AssemblyVersionFiles Include="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"/>
    </ItemGroup>
    
    <Target Name="AssemblyVersion"
                    Inputs="@(AssemblyVersionFiles)"
                    Outputs="UpdatedAssemblyVersionFiles">
        <Attrib Files="%(AssemblyVersionFiles.FullPath)"
                        Normal="true"/>
        <AssemblyInfo
            CodeLanguage="CS"
            OutputFile="%(AssemblyVersionFiles.FullPath)"
            AssemblyCompany="$(CompanyName)"
            AssemblyCopyright="Copyright $(CompanyName), All rights reserved."
            AssemblyVersion="$(Version)"
            AssemblyFileVersion="$(Version)">
            <Output TaskParameter="OutputFile"
                            ItemName="UpdatedAssemblyVersionFiles"/>
        </AssemblyInfo>
    </Target>