Каковы наилучшие методы использования ассемблеров сборки?

У меня есть решение с несколькими проектами. Я пытаюсь оптимизировать файлы AssemblyInfo.cs, связываясь с одним файлом информации об аксессуарах. Каковы наилучшие методы для этого? Какие атрибуты должны быть в широком разрешении и которые специфичны для проекта/сборки?


Редактирование: если вас интересует следующий вопрос Каковы различия между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?

Ответ 1

Мы используем глобальный файл GlobalAssemblyInfo.cs и локальный файл AssemblyInfo.cs. Глобальный файл содержит следующие атрибуты:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

Локальный AssemblyInfo.cs содержит следующие атрибуты:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Вы можете добавить GlobalAssemblyInfo.cs, используя следующую процедуру:

  • Выберите Добавить/Существующий элемент... в контекстном меню проекта
  • Выберите GlobalAssemblyInfo.cs
  • Разверните кнопку "Добавить", нажав на эту маленькую стрелку вниз справа.
  • Выберите "Добавить как ссылку" в раскрывающемся списке кнопок

Ответ 2

В моем случае мы создаем продукт, для которого у нас есть решение Visual Studio, с различными компонентами в их собственных проектах. Общие атрибуты идут. В решении имеется около 35 проектов и общая информация об ассетинге (CommonAssemblyInfo.cs), которая имеет следующие атрибуты:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Другие атрибуты, такие как AssemblyTitle, AssemblyVersion и т.д., мы предоставляем для каждой сборки. При сборке сборки каждая сборка AssemblyInfo.cs и CommonAssemblyInfo.cs встроена в каждую сборку. Это дает нам лучшее из обоих миров, где вы можете захотеть иметь некоторые общие атрибуты для всех проектов и конкретные значения для некоторых других.

Надеюсь, что это поможет.

Ответ 3

Решение, представленное @JRoppert, практически не отличается от того, что я делаю. Единственное различие заключается в том, что я помещаю следующие строки в локальный файл AssemblyInfo.cs, поскольку они могут меняться в каждой сборке:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

Я также (как правило) использую одну общую сборную информацию для каждого решения, исходя из предположения, что одно из решений представляет собой единую линейку продуктов/выпускаемых продуктов. В общем информационном файле сборки также есть:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Будет установлено значение "ProductVersion", отображаемое проводником Windows.

Ответ 4

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

Ответ 5

По-моему, использование GlobalAssemblyInfo.cs больше проблем, чем того стоит, потому что вам нужно изменить каждый файл проекта и не забудьте изменить каждый новый проект, в то время как вы по умолчанию получаете AssemblyInfo.cs.

Для изменений глобальных значений (например, Company, Product и т.д.) изменения обычно так редки и просты в управлении. Я не думаю, что DRY должно быть рассмотрено. Просто запустите следующий MSBuild script (в зависимости от MSBuild Extension Pack), когда вы хотите вручную изменить значения во всех проектах как однострочные, выключено:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

Ответ 6

Чтобы поделиться файлом между несколькими проектами, вы можете добавить существующий файл в качестве ссылки.

Чтобы сделать это, добавьте существующий файл и нажмите "Добавить как ссылку" в селектор файлов. Добавить как ссылку http://laurent. etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png

Что касается того, что добавить в общий файл, я бы предложил поместить вещи, которые будут совместно использоваться в сборках. Такие вещи, как авторское право, компания, возможно, версия.

Ответ 7

Использование одного файла AseemblyInfo.cs для нескольких проектов не рекомендуется. Файл AssemblyInfo содержит информацию, которая может иметь отношение только к этой конкретной сборке. Двумя наиболее очевидными частями информации являются AssemblyTitle и AssemblyVersion.

Лучшим решением может быть использование файла targets, который обрабатывается MSBuild, чтобы "внедрить" атрибуты сборки в несколько проектов.

Ответ 8

Одна вещь, которую я нашел полезной, - это сгенерировать элементы AssemblyVersion (и т.д.), применяя замену токена на фазе предварительной сборки.

Я использую TortoiseSvn, и его легко использовать SubWCRev.exe, чтобы превратить шаблон AssemblyInfo.wcrev в AssemblyInfo.cs. Соответствующая строка в шаблоне может выглядеть примерно так:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

Третий элемент - это номер ревизии. Я использую четвертый элемент для проверки, что я не забыл совершать какие-либо новые или измененные файлы (четвертый элемент - 00, если все в порядке).

Кстати, добавьте AssemblyInfo.wcrev в ваш контроль версий и игнорировать AssemblyInfo.cs, если вы используете это.