Поиск

Совместно используемые сборки

Совместное использование сборок имеет место, когда сборка предназначена для работы нескольких приложений и важно управление версиями (об управлении версиями см. следующий раздел). Для совместно используемой сборки необходимо создать совместно используемое имя (shared name, также известное как строгое имя, strong name) с помощью утилиты Strong Name из .NET SDK. Применение совместно используемых имен дает четыре главных преимущества.

  • С помощью этого механизма в .NET генерируются глобально уникальные имена.
  • Поскольку сгенерированная пара ключей (см. ниже) включает подпись, можно выявить попытки изменений исходных данных, имевшие место после их создания.
  • Строгие имена гарантируют, что сторонние разработчики не смогут выпускать другие версии созданной вами сборки. Этому препятствуют подписи — у сторонних разработчиков нет вашего закрытого ключа.
  • Когда .NET загружает сборку, исполняющая среда может проверитьпришла ли эта сборка из известного вызывающей стороне источника.

Первым шагом на пути создания строгого имени является применение утилиты Strong Name для создания файла ключа для сборки. Для этого укажите переключатель -k и имя выходного файла, в котором будет содержаться ключ. Здесь мы сделаем файл ключа InsideCSharp.key:

sn -k InsideCSharp.key

После выполнения этой команды вы получите подтверждающее сообщение:

Key pair written to InsideCSharp.key

Теперь добавим к исходному файлу атрибут assembly:AssemblyKeyFile. Здесь я создал другой простой набор файлов, чтобы проиллюстрировать, как это делается:

// Module3Server.cs
// компоновка со следующими переключателями командной строки:
// esc /t:module Module3Server.cs
internal class ModuleSServer
{
}
// Module3ClientApp.cs
// компоновка со следующими переключателями командной строки:
// esc /addmodule:Module3Server.netmodule Module3ClientApp.cs
using System;
using System.Diagnostics;
using System.Reflection;
[assembly:AssemblyKeyFile("InsideCSharp.key")]
class ModuleSClientApp <
public static void MainQ {
Assembly DLLAssembly =
Assembly. GetAssembly(typeof(Module3Server));
Console.WriteLine("Module1Server.dll Assembly Information");
Console.WriteLine("\t" + DLLAssembly);
Process p = Process.GetCurrentProcessQ;
string AssemblyName = p.ProcessName + ".exe";
Assembly ThisAssembly = Assembly.LoadFrom(AssemblyName);
Console.WriteLine("Module1Client.dll Assembly
Information"); Console.WriteLine("\t" + ThisAssembly); } }

Как видите, конструктор атрибута assembly-.AssemblyKey File принимает имя файла ключа, сгенерированного утилитой Strong Name, и позволяет задавать пару ключей, которая будет использована для создания строгого имени сборки. Важно понимать, что это атрибут уровня сборки. Поэтому он может быть помещен в любой из ее файлов и не прикреплен к какому-либо классу. Однако принято помещать этот атрибут сразу после операторов using перед определениями классов.

Запустив свое приложение, обратите внимание на значение Public-Key Token сборки. В двух предыдущих примерах оно было равно null, так как эти сборки считались закрытыми. Но теперь сборка определена как совместно используемая, и поэтому с ней ассоциирован маркер открытого ключа.

Module3Server.dll Assembly Information
ModuleSClient, Version=0.0.0.0, Culture=neutral,
PublicKeyToken=6ed7cefOc0065911
Module3Client.dll Assembly Information
ModuleSClient, Version=0.0.0.0, Culture=neutral,
PublicKeyToken=6ed7cefOc0065911

Объект Assembly, экземпляр которого мы создали для этой демонстрационной сборки, указывает, что она является совместно используемой. Но как узнать, какие сборки в системе под управлением .NET совместно используемые? Ответ — в глобальном кэше сборок.