Исходя из вашего последнего комментария к исходному вопросу, я бы выбрал другой подход и забыл подход, который вы используете в настоящее время. Вы должны знать, что информация о вашей версии не обязательно должна быть в файле AssemblyInfo.cs. Он может находиться в любом файле кода, если только у вас есть только атрибуты AssemblyVersion и AssemblyFileVersion, определенные по одному. С учетом сказанного, я бы сделал следующее:
- Удаление AssemblyVersion и AssemblyFileVersion из AssemblyInfo.cs
- Создайте новый файл, назовите его как хотите, в моем случае я поместил его в Properties \ VersionInfo.cs. Не добавлять этот файл в проект.
- Отредактируйте файл проекта, включив этот файл в список файлов, которые будут компилироваться, только когда вы этого захотите
Давайте немного расширим # 3. Когда вы создаете проект .NET, сам проект является файлом MSBuild. Внутри этого файла вы найдете элемент, объявленный Compile. Это список файлов, которые будут отправлены компилятору для компиляции. Вы можете динамически включать / исключать файлы из этого списка. В вашем случае вы хотите включить файл VersionInfo.cs только в том случае, если вы строите на сервере сборки (или при любых других определенных вами условиях). Для этого примера я определил это условие, если проект строился в режиме выпуска. Таким образом, для режима Release VersionInfo.cs будет отправляться компилятору, а для других сборок - нет. Вот содержимое VersionInfo.cs
VersionInfo.cs
[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]
Чтобы подключить это к процессу сборки, вам нужно отредактировать файл проекта. В этом файле вы найдете элемент (может быть больше 1 в зависимости от типа проекта). Вы должны добавить цель, подобную следующей.
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(Configuration)'=='Release' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
Вот что я здесь сделал, чтобы определить цель, BeforeCompile, которая является известной целью, которую вы можете переопределить. См. Эту статью MSDN о других подобных целях. По сути, это цель, которая всегда будет вызываться до вызова компилятора. В этой цели я добавляю VersionInfo.cs в элемент Compile, только если для свойства Configuration установлено значение release. Вы можете определить это свойство как хотите. Например, если в качестве сервера сборки используется TFS, это может быть
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(TeamFoundationServerUrl)'!='' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
Поскольку мы знаем, что TeamFoundationServerUrl определяется только при сборке через TFS.
Если вы строите из командной строки, то что-то вроде этого
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(IncludeVersionInfo)'=='true' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
А при сборке проекта просто сделайте msbuild.exe YourProject.proj / p: IncludeVersion = true. Примечание: это не будет работать при построении решения.