Основываясь на вашем последнем комментарии к исходному вопросу, я хотел бы воспользоваться другим подходом и забыть подход, который вы сейчас используете. Вы должны знать, что ваша информация о версии не обязательно должна быть в файле AssemblyInfo.cs. Он может быть в любом файле кода, если у вас есть только атрибуты AssemblyVersion и AssemblyFileVersion, определенные после каждого. Что было сказано, что я хотел бы сделать это выполните следующие действия:
- Удалить AssemblyVersion & AssemblyFileVersion из AssemblyInfo.cs
- Создать новый файл, назовите его, что вы хотите хотите в моем случае я положил его в свойствах \ VersionInfo.cs. Не добавляйте этот файл в проект.
- Редактировать файл проекта, чтобы включить этот файл в списке файлов для компиляции только тогда, когда вы хотите
Разложим немного на # 3. Когда вы создаете .NET-проект, сам проект является файлом MSBuild. Внутри этого файла вы найдете элемент, объявленный компиляцией. Это список файлов, которые будут отправлены компилятору для компиляции. Вы можете динамически включать/исключать файлы из этого списка. В этом случае вы хотите включить файл VersionInfo.cs только в том случае, если вы строите сервер сборки (или какое-либо другое условие, которое вы определяете). В этом примере я определил, какое условие должно быть, если проект строился в режиме Release. Таким образом, для режима 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 article о других аналогичных целях. В основном это цель, которая всегда будет вызываться до вызова компилятора. В этой цели я добавляю 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/р: IncludeVersion = TRUE. Примечание: при построении решения это не сработает.
В MSBuild нет такой функции, встроенной в MSBuild. Можете ли вы лучше объяснить, что вы делаете, чтобы другие могли предоставить некоторые альтернативы? –
Конечно ... В основном я пытаюсь это сделать: 1.) Скопируйте сборкуinfo.cs в файл резервной копии (assemblyinfo.cs.original) 2.) Измените assemblyinfo.cs, чтобы включить информацию об управлении версиями. Информация о версиях исходит из пользовательской задачи MSBuild. 3.) Составьте приложение и/или сборку 4.) Замените файл assemblyInfo.cs исходным файлом (assemblyinfo.cs.original) Я хочу, чтобы на этапе 4 произошла ошибка, возникающая во время процесса сборки. –