Работа со сборками .net

В данной заметке опишу как описывать зависимости сборок в web.config, как добавлять сборки в gac, как смотреть список зависимых сборок с помощью утилиты ildasm, как создавать и смотреть открытый ключ в vs и др.

  1. В Web.config зависимости сборок описываются в элементе assemblyBinding
    <configuration>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            </assemblyBinding>
        </runtime>
    </configuration>
    

    Для того чтобы наше приложению загружала только самую последнюю версию сборки нужно добавить такие строчки  в элемент assemblyBinding

    <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="7dba78c9c3087bd1" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    

    Для того чтобы приложение загружала разные версии сборок нужно добавить такие строчки  в элемент assemblyBinding

    <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="7dba78c9c3087bd1"/>
        <codeBase version="2.0.0.0" href="bin\MyAssembly\v2\MyAssembly.dll" />
    </dependentAssembly>
    

    Таким образом 2-ая версия сборки MyAssembly будет загружена из папки bin\MyAssembly\v2\MyAssembly.dll, а последняя версия (3-я версия) из папки по умолчанию (bin)

  2. Разные версии сборок можно загружать из глобального кэша сборок (gac). То есть 2-ую версию сборки MyAssembly можно занести в кэш, а приложение уже в свою очередь загрузит эту сборку из кэша.
    Добавим сборку MyAssembly в gac. Для этого в командной строке vs (командную строку vs можно запустить так: переходим в каталок C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts и запускаем консоль VS2013 под администратором) выполним такую инструкцию

    gacutil -i MyProjectBasePath\bin\MyAssembly\v2\MyAssembly.dll
    

    А для того чтобы убедиться что данная версия сборки находится в кэше, выполним такую инструкцию

    gacutil -l MyAssembly
    

    Или посмотрим сборку по такому пути — c:\Windows\Microsoft.Net\assembly\GAC_MSIL\MyAssembly\MyAssembly.dll.
    Ну и для того чтобы удалить сборку из кэша, выполним такую инструкцию

    gacutil -u MyAssembly
    
  3. Чтобы посмотреть текущую версию своей сборки, нужно открыть файл MyProjectBasePath\Properties\AssemblyInfo.cs и посмотреть такую  строчку
    [assembly: AssemblyVersion("2.0.0.0")]
    

    Чтобы посмотреть версии зависимых сборок нужно в проекте открыть References и для нужной сборки вызвать контекстное меню и после выбрать Свойства.
    Так же можно открыть файл packages.config и посмотреть там версии зависимых сборок. Но версия в packages.config не всегда соответствует версиям в свойствах сборки, поэтому лучше не использовать этот способ.

  4. Посмотреть версию текущей сборки и версии зависимых сборок можно с помощью утилиты ildasm.
    Запускаем ildasm из командной строки vs, для этого вводим такую инструкцию

    ildasm PathToMyAssembly.dll
    

    Версию текущей сборки смотрим в нижней области окна. А чтобы посмотреть версии зависимых сборок — открываем файл manifest. Здесь же смотрим и ключи зависимых сборок.

  5. Чтобы создать ключ сборки нужно открыть на проекте окно «Свойства», перейти на вкладку «Подписывание», отметить галочку «Подписать сборку» и выбрать опцию «Создать» в селекте «Выберите файл ключа строгого имени». После откроется всплывающее окно «Создание ключа строгого имени», в котором пишем MyAssembly.snk в поле «Имя файла ключей», убираем галочку «Защитить мой файл ключей паролем». Жмем кнопку «ОК»,  после чего в проекте создается файл MyAssembly.snk. Перестроим проект. Ключ сборки создан.
  6. Чтобы посмотреть ключ нужно сначала создать внешний инструмент в vs.
    Для этого открываем окно «Внешние инструменты» — Сервис->Внешние инструменты. Жмем кнопку «Добавить» и вводим соответственно в поля  «Название», «Команда», «Аргументы» значения «Get &PublicKeyToken», «c:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe», «-Tp $(TargetPath)». Убираем галочку «Закрыть при выходе» и жмем кнопку «ОК». Инструмент готов. Используем так Сервис -> Get PublicKeyToken, откроется окно, в котором смотрим «Токен открытого ключа: 7dba78c9c3087bd1″.
  7. В коде программы можно проверить правильно ли загрузились сборки, для этого пишем такую функцию
    static void OutputAssemblyInfo(string assemblyName)
    {
        Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        List<Assembly> assemblies = new List<Assembly>();
        foreach (Assembly a in allAssemblies)
        {
            if (a.FullName.StartsWith(assemblyName))
            {
                assemblies.Add(a);
            }
        }
        Console.WriteLine("the number of assemblies: " + assemblies.Count);
        foreach (Assembly a in assemblies)
        {
            Console.WriteLine("FullName: " + a.FullName + "; Location: " + a.Location);
        }
    }
    

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *