2013-05-29 3 views
2

После завершения моей сборки я хотел бы переименовать сгенерированный файл .exe, используя команду post-build, которая добавляется в конец файла проекта .csproj (внутри элемента Project):Ссылка AssemblyFileVersion в файле csproj

<Target Name="AfterBuild"> 
    <Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-$(AssemblyFileVersion).exe" SkipUnchangedFiles="true" /> 
</Target> 

Как вы можете видеть выше, я пытаюсь переименовать исполняемый файл на: MyApplication - $ (AssemblyFileVersion) .exe, однако, это, очевидно, не так, как в результате исполняемый файл называется просто: MyApplication-.exe (поэтому версия, которую я пытаюсь добавить в конце имени файла, отсутствует).

Я определил AssemblyFileInfoVersion в файле AssemblyInfo.cs следующим образом:

[assembly: AssemblyFileVersion("1.5.1")] 

Таким образом, вопрос: Как я могу получить доступ к AssemblyFileVersion в csproj файл того же проекта?

ответ

3

GetAssemblyIdentity может получить информацию о выполненных сборках. Вывод задачи содержит записи метаданных о версии, PublicKeyToken и культуре.

Я использовал $(TargetDir)\$(TargetName).exe как файл сборки.

<ItemGroup> 
    <AssembliesPath Include="$(TargetDir)\$(TargetName).exe" /> 
</ItemGroup> 

<Target Name="GetAssemblyInfo"> 
    <GetAssemblyIdentity AssemblyFiles="@(AssembliesPath)"> 
     <Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/> 
    </GetAssemblyIdentity> 
</Target> 

И потом:

<Target Name="AfterBuild"> 
    <GetAssemblyInfo /> 
    <Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" /> 
</Target> 
+0

Привет, спасибо за Ваш ответ :)!Однако сгенерированное число составляет 0.0.0.0 вместо 1.5.1 (см. Выше для обновления моего вопроса) - поэтому, похоже, он не обращается к AssemblyFileVersion, а что-то еще. Есть идеи? – AgentKnopf

+0

@ Zainodis, если вы установите '[assembly: AssemblyVersion (" 1.5.1 ")]' вы получите то, что хотите. 'GetAssemblyIdentity' только читает' AssemblyVersion', а не 'AssemblyFileVersion'. –

+0

@LexLi на самом деле я подозревал это и пробовал его, прежде чем публиковать свой комментарий выше, но даже если я изменил это значение, он все еще выплевывает число 0.0.0.0 oO - мог ли я что-то упустить? – AgentKnopf

1

Следующий код из оригинального ответа ISun и это на самом деле, как я в конечном итоге делает это в конце концов, как у меня были проблемы, определяющие пользовательскую задачу (мс построить ссылки постоянно подвергались автоматическому удару, а сборка продолжалась и снова и снова).

Как вы можете видеть из комментариев в ответ ISun, я всегда получал версию 0.0.0.0 - несмотря на то, что изменил версию AssemblyFileVersion и AssemblyVersion на 1.0.0.0, открыв сборку AssemblyInfo.cs в текстовом редакторе. Позже я прочитал, как редактировать AssemblyInfo.cs из моего Visual Studio, вот как:

  • Щелкните правой кнопкой мыши на вашем проекте (который генерирует исполняемый файл)
  • Нажмите на Свойства
  • Open Вкладка приложения (первая вкладка слева) в открывшемся окне
  • Вы увидите поля для установки имени Ассамблеи, пространства имен по умолчанию и т. д., однако, чтобы отредактировать файл AssemblyInfo.cs , просто нажмите кнопку Информация Ассамблея справа

И по какой-то причине - я понятия не имею, почему это вдруг сработало, после того, как я положил всю информацию по указанным выше способом (с помощью Visual Studio)! Когда я впервые открыл AssemblyInfo.cs, используя вышеописанный способ, все мои поля были фактически пустыми, несмотря на то, что они были заполнены в фактическом файле.

И теперь, когда я получил AssemblyInfo.cs, чтобы, наконец, правильно работать, я использовал исходный код ISun для достижения своей цели. Добавляя следующий фрагмент кода непосредственно перед закрывающим тегом в .csproj файл моего проекта:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

<Target Name="AfterBuild"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetDir)\$(TargetName).exe"> 
     <Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/> 
    </GetAssemblyIdentity> 
    <Copy SourceFiles="$(TargetDir)\$(TargetName).exe" DestinationFiles="$(TargetDir)\MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" /> 
</Target> 
Смежные вопросы