GlobalAssemblyInfo.cs и сильные имена - PullRequest
7 голосов
/ 03 апреля 2009

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

#pragma warning disable 1699
[assembly : AssemblyKeyFile("..\\keyfile.snk")]
#pragma warning restore 1699

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

Есть ли у кого-нибудь лучшее решение, чем это, кроме как проходить через каждый проект, задав строгие имена в файле проекта?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2009

Ну, чтобы избежать проблемы пути, вы можете использовать [assembly:AssemblyKeyName(...)] (хотя IIRC это также не рекомендуется); используйте sn -i для установки именованного ключа. Каждому компьютеру (который выполняет сборку) потребуется добавить этот ключ.

Кроме этого; да, вам, вероятно, потребуется отредактировать файлы проекта.

1 голос
/ 03 апреля 2009

Ричард хорошо говорит об утечке информации - теперь я нашел сообщения от команды Microsoft .NET, где они описывают это. Поэтому я пошел за его предложением и придумал следующую цель NAnt:

  <target name="strongName" description="Strong names the output DLLs">
    <foreach item="File" property="filename">
      <in>
        <items>
          <include name="**/*.csproj"></include>
          <exclude name="**/*.Test.csproj"></include>
        </items>
      </in>
      <do>
        <echo message="${filename}" />
        <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:SignAssembly" value="false">
          <namespaces>
            <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
          </namespaces>
        </xmlpoke>
        <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:AssemblyOriginatorKeyFile" value="..\keyfile.snk">
          <namespaces>
            <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
          </namespaces>
        </xmlpoke>
      </do>
    </foreach>
  </target>

Элемент необходим для разрешения XPath в файле csproj - обратите внимание, что это для VS2008, и в VS2005 может потребоваться что-то немного другое.

1 голос
/ 03 апреля 2009

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

Если у вас много проектов, можно установить их с помощью записанного макроса или даже напрямую манипулировать файлами .csproj (сначала убедитесь, что они выгружены из VS).

...