C windows microsoft net assembly gac msil

Последнее обновление: 31.10.2015

По способу взаимодействия с другими сборками и приложениями сборки можно разделить на две категории: закрытые и разделяемые.

Закрытые сборки это обычные сборки приложения, которые мы создаем в Visual Studio. Например, при создании библиотеки классов dll
создается закрытая сборка. Впоследствии эту закрытую сборку мы можем использовать, подключив ее к другому проекту. А чтобы
подключить к другому проекту, эту сборку можно просто положить рядом с исполняемым файлом и добавить в проект ссылку на нее через
Add Reference. И на одной машине может быть десяток приложений, которые используют разные копии одной и той же сборки.

Если мы захотим удалить приложение, мы можем также удалить и используемую им закрытую сборку, и это не скажется на работе
других приложений на локальной машине.

Иначе обстоит дело с разделяемыми сборками. По умолчанию при создании проекта visual Studio уже добавляет в проект ссылки на
ряд разделяемых сборок. Открыв узел References (Ссылки). Например, Microsoft.CSharp.dll, System.dll, System.Core.dll — это все разделяемые сборки.

Разделяемые сборки находятся в глобальном кэше сборок (Global Assembly Cache). Местоположение кэша сборок отличается в зависимости от
версии .NET, установленной на локальной машине. До .NET 4.0 глобальный кэш находился в каталоге C:\Windows\assembly.
Начиная же с версии .NET 4.0 кэш сборок размещается по пути C:\Windows\Microsoft.NET\assembly\GAC_MSIL

Строгое имя сборки

Чтобы поместить сборку в GAC (глобальный кэш), эта сборка должна обладать строгим именем. В состав строгого имени входят следующие компоненты:

  • Имя сборки без расширения

  • Номер версии. Благодаря разграничению по версии можно использовать разные версии одной и ой же сборки

  • Открытый ключ

  • Необязательное значение для культуры (при локализации сборки)

  • Цифровая подпись, которая создается с помощью хэш-значения содержимого сборки и значения секретного ключа. Секретный ключ представляет собой файл
    с расширением *.snk.

Благодаря строгому имени гарантируется уникальность сборки в глобальном кэше.

Чтобы создать строгое имя, можно воспользоваться инструментарием, который имеется в Visual Studio. Допустим, мы создали проект
по типу Class Library (Библиотека классов). И теперь мы хотим подписать сборку, которая будет компилироваться, строгим именем. Для
этого нажмем в окне Solution Explorer (Обозреватель решений) на имя проекта правой кнопкой мыши и в появившемся меню выберем пункт
Properties (Свойства). На вкладке свойств выберем пункт Signing:

Создание строгого имени сборки в C#

Отметим флажок Sign the assembly (Подписать сборку), как показано на рисунке. И чтобы создать новый секретный ключ, выберем в выпадающем списке
пункт New. После этого откроется окно настроек секретного ключа:

Дадим новому ключу какое-нибудь имя и нажмем ОК. После этого в структуре проекта можно будет увидеть файл ключа:

После задания сборке строгого имени ее можно добавлять в GAC. Для этого воспользуемся утилитой, которая идет в комплекте с .NET Framework,
под названием gacutil.exe.

Откроем командную строку под администратором. Во-первых, найдем расположение утилиты gacutil.exe на локальной машине. У меня, например,
она расположена в каталоге C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools. И вначале перейдем в этот каталог:

C:\Windows\system32>cd C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

Теперь воспользуемся одной из команд данной утилиты. Наиболее используемые команды:

  • -i имя_сборки — установка сборки в GAC

  • -l — вывод всего списка сборок в GAC

  • -u имя_сборки — удаление сборки из GAC

Теперь вводим в командной строке команду на добавление:

C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools>gacutil -i Полное_имя_сборки

Как видно, на рисунке, в моем случае полное имя сборки C:\Users\Eugene\Documents\Visual Studio 2012\Projects\Sharp\PersonLibrary\PersonLibrary\bin\Debug\PersonLibrary.dll.
И если добавление прошло успешно, то командная строка отобразит:

Assembly successfully added to the cache

И после добавления в папке C:\Windows\Microsoft.NET\assembly\GAC_MSIL мы сможем найти добавленную сборку — для нее будет создан
отдельный каталог, как и для остальных сборок, который будет носить краткое имя сборки.

Теперь мы можем использовать нашу сборку из GAC. Для этого создадим какой-нибудь проект и в окне Solution Exlplorer (Обозреватель решений)
нажмем на узел Referenses (Ссылки). В появившемся меню выберем Add Reference… (Добавить ссылку):

В окне добавления ссылки на сборку нажмем внизу на кнопку Browse (Обзор) и найдем в GAC нашу сборку. После этого она будет добавлена в проект, и
мы сможем использовать весь заложенный в ней функционал.

  • Remove From My Forums
  • Вопрос

  • I noticed that when deploying BTS applications, related assemblies are put into C:\Windows\Microsoft.NET\assembly\GAC_MSIL, instead of C:\Windows\assembly. Any reason for that? How do I manually put my assembly to C:\Windows\Microsoft.NET\assembly\GAC_MSIL?
    Using gacutil only put it to C:\Windows\assembly. Do we have similar tool to put it to C:\Windows\Microsoft.NET\assembly\GAC_MSIL?

    Thanks in advance!

    Cindy

     

Ответы

    • Предложено в качестве ответа

      11 марта 2012 г. 10:00

    • Помечено в качестве ответа
      Lloyd ZhangModerator
      13 марта 2012 г. 9:15
    • Помечено в качестве ответа
      Lloyd ZhangModerator
      13 марта 2012 г. 9:14
    • Помечено в качестве ответа
      Lloyd ZhangModerator
      13 марта 2012 г. 9:14
    • Предложено в качестве ответа
      Tayyab.Siddiqui
      6 марта 2012 г. 15:46
    • Помечено в качестве ответа
      Lloyd ZhangModerator
      13 марта 2012 г. 9:14
    • Изменено
      Randy Paulo
      7 марта 2012 г. 5:18
    • Предложено в качестве ответа
      Steef-Jan WiggersMVP, Moderator
      11 марта 2012 г. 10:00
    • Помечено в качестве ответа
      Lloyd ZhangModerator
      13 марта 2012 г. 9:15

Hope, some of you still think that the default GAC folder is c:\windows\assembly [%windir%\assembly] as such. But there is a BIG “NO”.

Yes, starting with the .NET Framework 4, the default location for the global assembly cache has been changed.

Reference: http://msdn.microsoft.com/en-us/library/yf1d93sz(v=vs.110).aspx

In .NET Framework 4.0, the GAC went through a few changes. The GAC was split into two, one for each CLR. The CLR version used for both .NET Framework 2.0 and .NET Framework 3.5 is CLR 2.0. There was no need in the previous two framework releases to split GAC. The problem of breaking older applications in Net Framework 4.0.

To avoid issues between CLR 2.0 and CLR 4.0, the GAC is now split into private GAC’s for each runtime. The main change is that CLR v2.0 applications now cannot see CLR v4.0 assemblies in the GAC.

.NET 2.0 GAC:

  • c:\windows\assembly – Non-native 32bit and 64bit assemblies.

.NET 4.0 GAC, below are the folders.

  • c:\windows\Microsoft.NET\assembly\GAC_32 – Non-native 32bit assemblies.
  • c:\windows\Microsoft.NET\assembly\GAC_64 – Non-native 64bit assemblies visible only on 64bit Windows.
  • c:\windows\Microsoft.NET\assembly\GAC_MSIL – Non-native MSIL (AnyCPU – 32bit & 64bit) assemblies.

Note:

While trying to load assemblies from the GAC, the CLR first looks at the GAC specific to the platform. If it is unable to find the same, it then moves to the GAC_MSIL.

Happy reading! 🙂

Posted by lakswin on March 6, 2014 at 3:09 pm
Filed under Assembly, C#, DotNet, GAC  | 
Tags: GAC, global assembly cache  | 
Leave a comment  |  Trackback URI

В данной заметке опишу как описывать зависимости сборок в 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);
        }
    }
    

Ссылки:

  • http://professorweb.ru/my/csharp/assembly/level1/assembly_index.php — работа со сборками
  • https://msdn.microsoft.com/ru-ru/library/1xtk877y(v=vs.110).aspx — понимание файлов конфигурации
  • https://msdn.microsoft.com/ru-ru/library/yx7xezcf(v=vs.110).aspx — обнаружение сборок в среде выполнения
  • http://professorweb.ru/my/csharp/assembly/level1/1_9.php — добавляем сборку в gac
  • http://professorweb.ru/my/csharp/charp_theory/level1/1_8.php — смотри манифест сборки
  • http://professorweb.ru/my/csharp/assembly/level1/1_8.php — создаем ключ сборки
  • http://blogs.msdn.com/b/kaevans/archive/2008/06/18/getting-public-key-token-of-assembly-within-visual-studio.aspx — смотрим ключ сборки в vs
  • http://stackoverflow.com/questions/52797/how-do-i-get-the-path-of-the-assembly-the-code-is-in  — получить путь к сборке из кода
  • http://stackoverflow.com/questions/851248/c-sharp-reflection-get-all-active-assemblies-in-a-solution — получить список сборок из кода

Читайте также

  • 👉 Преобразование восьмеричного числа в десятичное и наоборот в C++
  • 👉 Преобразование двоичного числа в восьмеричное и наоборот в C++
  • 👉 Как перевернуть строку в C++

An Assembly is a basic building block of .Net Framework applications. It is basically a compiled code that can be executed by the CLR. An assembly is a collection of types and resources that are built to work together and form a logical unit of functionality. An Assembly can be a DLL or exe depending upon the project that we choose.

Assemblies are basically the following two types:

  1. Private Assembly
  2. Shared Assembly

1. Private Assembly

It is an assembly that is being used by a single application only. Suppose we have a project in which we refer to a DLL so when we build that project that DLL will be copied to the bin folder of our project. That DLL becomes a private assembly within our project. Generally, the DLLs that are meant for a specific project are private assemblies.

2. Shared Assembly

Assemblies that can be used in more than one project are known to be a shared assembly. Shared assemblies are generally installed in the GAC. Assemblies that are installed in the GAC are made available to all the .Net applications on that machine.

However, there are two more types of assemblies in .Net, Satellite Assembly, and Shared Assembly.

GAC

GAC stands for Global Assembly Cache. It is a memory that is used to store the assemblies that are meant to be used by various applications.

Every computer that has CLR installed must have a GAC. GAC is a location that can be seen at “C:\Windows\assembly” for .Net applications with frameworks up to 3.5. For higher frameworks like 4 and 4.5 the GAC can be seen at:

“C:\Windows\Microsoft.NET\assembly\GAC_MSIL”.

Installing an assembly into the GAC

For installing an assembly into the GAC we first need to generate strong names for the assembly because only a strong name assembly is installed in the GAC. All other assemblies are known as weak named assemblies and they cannot be stored in the GAC.

For generating a strong name assembly we first create a console application type project. In that solution, we will add one more project (Class Library).

Class Library

In the Class Library project, I created a class Student that contains a method that returns a string. Now I will add a reference of the Class Library to my Console application project and will use this method.

If we see the bin folder of our Console Application project then we will see that the ClassLibrary DLL is present there (It will come when we build our project). This DLL is a Private Assembly now.

Console application project

Generating Strong Name

To make our assembly strongly named we need to generate a unique key-value pair, for that we need to open the Visual Studio command prompt. We can open that from the Start button by going to «All programs» -> «Visual Studio 2012» (or any version that you have)  -> «Visual Studio Tools» -> «Developer Command Prompt for Visual Studio» and run that as an administrator.

Command Prompt

 

Then type the command sn –k “Path where you want that key to be generated”

command

This will generate the unique key pair that we will use in our application.

Now move to the Visual Studio Class Library Project and open the AssemblyInfo.cs file that is residing in the Properties folder of your project. In the bottom of that file add a new attribute that refers to the key pair file that we have just created.

[assembly: AssemblyKeyFile(«D:\\strongname.snk»)] 

attribute

Now build your Class Library project and ensure it builds successfully. If it builds then it means that your ClassLibrary DLL has become strongly typed. If you want to check that then open the Visual Studio command prompt, copy the path of the «bin.Debug» folder of your ClassLibrary project. Now paste the path into the command prompt with the cd command (refer to the following screenshot). Now type the command sn –T “ClassLibrary.dll”. After typing this command you will get a public key token that indicates that your assembly is Strongly Named and it is ready to install in the GAC.

install in GAC

Now to install the assembly in the cache type the following command in the command prompt:

gacutil –i «Name of the Class Library»

install assembly in cache

Now the Assembly is successfully installed on the system. If you want to see that you can see that in the location “C:\Windows\Microsoft.NET\assembly\GAC_MSIL”.

Note: If you are using the framework greater than 4.0 then you can search the preceding given path but if you are using a framework lesser than 4.0 then your assembly will be installed at “C:\Windows\assembly”.

installed

 

In order to use  GAC assembly please refer to the below link

  • C users default windows 10
  • C programdata windows task service
  • C programdata microsoft windows wer temp
  • C programdata microsoft windows wer reportarchive
  • C programdata microsoft windows apprepository