Отложенная подпись сборкиDelay-sign an assembly

Организация может располагать тщательно оберегаемой парой ключей, повседневный доступ к которой разработчикам не предоставляется.An organization can have a closely guarded key pair that developers can't access on a daily basis. Открытый ключ часто является доступным, но доступ к закрытому ключу предоставляется лишь отдельным лицам.The public key is often available, but access to the private key is restricted to only a few individuals. При разработке сборок со строгими именами каждая сборка, в которой имеется ссылка на другую сборку со строгим именем, должна содержать маркер открытого ключа, использованного для присвоения строгого имени второй сборке.When developing assemblies with strong names, each assembly that references the strong-named target assembly contains the token of the public key used to give the target assembly a strong name. Данный подход требует, чтобы открытый ключ был доступен во время процесса разработки.This requires that the public key be available during the development process.

Во время компоновки сборки можно использовать отложенную или частичную подпись для того, чтобы зарезервировать в переносимом исполняемом файле (PE-файле) место для подписи строгого имени, а применение полноценной подписи отложить и выполнить на следующем этапе (обычно непосредственно перед поставкой сборки).You can use delayed or partial signing at build time to reserve space in the portable executable (PE) file for the strong name signature, but defer the actual signing until some later stage, usually just before shipping the assembly.

Отложенная подпись сборки:To delay-sign an assembly:

  1. Получите открытый ключ, входящий в состав пары ключей, у организации, отвечающей за окончательную подпись.Get the public key portion of the key pair from the organization that will do the eventual signing. Обычно этот ключ указывается в формате файла SNK, который может быть создан с помощью программы строгих имен (Sn.exe) , входящей в состав Windows SDK.Typically this key is in the form of an .snk file, which can be created using the Strong Name tool (Sn.exe) provided by the Windows SDK.

  2. Включите в исходный код сборки два указанных ниже настраиваемых атрибута из пространства имен System.Reflection.Annotate the source code for the assembly with two custom attributes from System.Reflection:

    • Атрибут AssemblyKeyFileAttribute, который передает имя файла, содержащего открытый ключ, своему конструктору в качестве параметра.AssemblyKeyFileAttribute, which passes the name of the file containing the public key as a parameter to its constructor.

    • АтрибутAssemblyDelaySignAttribute, который указывает, что используется отложенная подпись, передавая значение true своему конструктору в качестве параметра.AssemblyDelaySignAttribute, which indicates that delay signing is being used by passing true as a parameter to its constructor.

    Пример:For example:

    [assembly:AssemblyKeyFileAttribute("myKey.snk")];
    [assembly:AssemblyDelaySignAttribute(true)];
    
    [assembly:AssemblyKeyFileAttribute("myKey.snk")]
    [assembly:AssemblyDelaySignAttribute(true)]
    
    <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
    <Assembly:AssemblyDelaySignAttribute(True)>
    
  3. Компилятор вставляет открытый ключ в манифест сборки и резервирует в PE-файле место для полной подписи строгого имени.The compiler inserts the public key into the assembly manifest and reserves space in the PE file for the full strong name signature. При компоновке сборки должен использоваться подлинный открытый ключ, чтобы другие сборки, ссылающиеся на данную сборку, могли получить этот ключ и сохранить его в своих ссылках на сборку.The real public key must be stored while the assembly is built so that other assemblies that reference this assembly can obtain the key to store in their own assembly reference.

  4. Так как подпись строгого имени сборки пока некорректна, необходимо отключить проверку этой подписи.Because the assembly does not have a valid strong name signature, the verification of that signature must be turned off. Это можно сделать с помощью программы строгих имен, используя параметр –Vr.You can do this by using the –Vr option with the Strong Name tool.

    В следующем примере производится отключение проверки сборки с именем myAssembly.dll.The following example turns off verification for an assembly called myAssembly.dll.

    sn –Vr myAssembly.dll
    

    Чтобы отключить проверку на платформах, где нельзя запустить средства для работы со строгими именами, такими как микропроцессоры Advanced RISC Machine (ARM), используйте параметр –Vk для создания файла реестра.To turn off verification on platforms where you can’t run the Strong Name tool, such as Advanced RISC Machine (ARM) microprocessors, use the –Vk option to create a registry file. Импортируйте файл реестра в реестр на компьютере, где нужно отключить проверку.Import the registry file into the registry on the computer where you want to turn off verification. В следующем примере создается файл реестра для myAssembly.dll.The following example creates a registry file for myAssembly.dll.

    sn –Vk myRegFile.reg myAssembly.dll
    

    С помощью параметра –Vr или –Vk можно дополнительно включить файл SNK для подписывания ключа теста.With either the –Vr or –Vk option, you can optionally include an .snk file for test key signing.

    Предупреждение

    Строгие имена не являются средством обеспечения безопасности.Do not rely on strong names for security. Они служат только для однозначной идентификации.They provide a unique identity only.

    Примечание

    Если во время разработки с помощью Visual Studio на компьютере с 64-разрядной архитектурой используется отложенная подпись и сборка компилируется для конфигурации Любой ЦП, возможно, параметр -Vr потребуется применить дважды.If you use delay signing during development with Visual Studio on a 64-bit computer, and you compile an assembly for Any CPU, you might have to apply the -Vr option twice. (В Visual Studio конфигурация Любой ЦП является значением свойства сборки Целевая платформа; при компиляции из командной строки это параметр по умолчанию.) Чтобы запустить приложение из командной строки или в проводнике, используйте 64-разрядную версию Sn.exe (средство строгих имен) для применения к сборке параметра -Vr.(In Visual Studio, Any CPU is a value of the Platform Target build property; when you compile from the command line, it is the default.) To run your application from the command line or from File Explorer, use the 64-bit version of the Sn.exe (Strong Name tool) to apply the -Vr option to the assembly. Чтобы загрузить сборку в Visual Studio во время разработки (например, если сборка содержит компоненты, используемые другими сборками в приложении), необходимо использовать 32-разрядную версию средства работы со строгими именами.To load the assembly into Visual Studio at design time (for example, if the assembly contains components that are used by other assemblies in your application), use the 32-bit version of the strong-name tool. Причина заключается в том, что JIT-компилятор компилирует сборки в 64-разрядный машинный код, когда сборка запускается из командной строки, и в 32-разрядный машинный код, когда сборка загружается в среду во время разработки.This is because the just-in-time (JIT) compiler compiles the assembly to 64-bit native code when the assembly is run from the command line, and to 32-bit native code when the assembly is loaded into the design-time environment.

  5. Позже, обычно сразу перед поставкой, необходимо отправить сборку в подписывающий центр организации для подписания действующим строгим именем с помощью параметра программы строгих имен –R.Later, usually just before shipping, you submit the assembly to your organization's signing authority for the actual strong name signing using the –R option with the Strong Name tool.

    В следующем примере сборка с именем myAssembly.dll подписывается строгим именем с помощью пары ключей sgKey.snk.The following example signs an assembly called myAssembly.dll with a strong name using the sgKey.snk key pair.

    sn -R myAssembly.dll sgKey.snk
    

См. такжеSee also