Только подписывать сборки со строгим именем во время сборки выпуска - PullRequest
11 голосов
/ 26 октября 2011

Сценарий таков: я создаю свое решение с помощью TeamCity, я не использую учетную запись сборки в качестве администратора;поэтому у меня возникают проблемы с ключами со строгим именем.

Я знаю несколько решений, таких как запуск сборки в качестве администратора и регистрация сертификатов в соответствующем контейнере.подписывать сборки в файле решения только во время сборки выпуска, а не во время отладочной сборки.Или есть какие-то аналогичные решения?

Мне кажется странным, что нет параметра MSBuild, который можно установить, если сборки должны быть подписаны или нет.Потому что, если вы посмотрите на csproj-файлы, там есть опция для подписанных или не подписанных

Ответы [ 3 ]

11 голосов
/ 28 октября 2011

Другой вариант - отредактировать файл проекта. По умолчанию, если вы включите подпись сборки в Visual Studio, она будет использоваться для всех конфигураций сборки. Файл проекта содержит элемент, подобный следующему.

<PropertyGroup>
  <SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
  <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>

Если вы хотите подписывать сборки только во время определенной конфигурации сборки, например, RELEASE. Вы можете поместить <SignAssembly> и <AssemblyOriginatorKeyFile> в элемент PropertyGroup с условием, которое идентифицирует вашу конфигурацию сборки.

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

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <!-- other element of this PropertyGroup -->
  <SignAssembly>true</SignAssembly>      
  <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>

Примечание: Когда вы изменяете файл проекта, на следующее. Вы не можете изменить параметры подписи свойств проекта в Visual Studio. Это означает, что в Visual Studio подпись сборки отключена, даже если вы измените конфигурацию сборки в Visual Studio.

4 голосов
/ 21 ноября 2014

Вот решение, в котором сборка подписана в конфигурации Release, но не в конфигурации отладки.Он использует средства подписи из проекта, а не атрибут [AssemblyKeyFile].Это в основном то же самое, что и ответ Джехофа , но другими словами.

  1. Настройка проекта для входа на вкладку Подписание в настройках проекта.
  2. Выгрузите проект и отредактируйте его в редакторе XML.Найдите свойство SignAssembly.Переместите это свойство в две группы свойств, зависящие от конфигурации.В конфигурации отладки задайте для свойства значение false.

Это будет выглядеть примерно так:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <!-- ... -->
    <SignAssembly>false</SignAssembly>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <SignAssembly>true</SignAssembly>
</PropertyGroup>

Visual Studio работает правильно даже при изменении конфигурации сборки, за исключением Подписать сборку флажок на вкладке Подпись .Я тестировал с Visual Studio 2008.

Cave-Eats:

  • Вам нужно удалить атрибут [AssemblyKeyFile], чтобы это работало.
  • Если у вас есть [InternalsVisibleTo] атрибутов, вам нужно поддерживать две версии, например:
#if DEBUG
[assembly: InternalsVisibleTo("MyLib.NUnit")]
#else
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")]
#endif

Другими словами, MyLib.NUnit также должен быть подписан в конфигурации Release.

4 голосов
/ 26 октября 2011

Вы можете использовать директивы препроцессора:

#if SIGN
//Only the Release build is signed
#pragma warning disable 1699  //We can't use the compiler switch
[assembly: AssemblyKeyName("KeyContainerName")]
#pragma warning restore 1699
#endif

Затем определите символ SIGN в конфигурации выпуска.

Вы должны установить ключ в контейнер ключей, используя sn.exe. В качестве альтернативы вы можете использовать [AssemblykeyFile] для указания пути.

#pragma подавляет это предупреждение .

...