2. Global Assembly Cache (GAC) (разделяемые сборки).
3. Конкретного файла на диске.
Первые два способа идентифицируют сборку по имени.
Полное имя сборки содержит, помимо собственно имени, также версию сборки, информацию о локализации (Culture) и открытый ключ сборки (PublicKeyToken). Вот пример имени сборки:
Имя сборки может быть как полным, так и частичным. Частичное имя сборки позволяет задействовать специальный механизм поддержания версий сборок. Метод LoadWithPartialName класса Assembly загружает сборку по частичной информации о ней.
В данном случае передано только имя сборки. В соответствии с политикой версий будет выбрана и загружена наиболее подходящая сборка. Этот способ более гибок, т.к. позволяет управлять загрузкой сборок, задавая или опуская различные параметры. Например, если вы укажете номер версии, то сборки другой версии (пусть даже более поздней!) использоваться не будут. А если явно задать локализацию (культуру), то в будущем не нужно беспокоиться, что приложение случайно подключит новую версию сборки, не поддерживающую указанную локализацию.
Динамическая загрузка сборок из каталога приложения не требует указания полного имени сборки, достаточно краткого имени.
Функции Assembly.Load и Assembly.LoadWithPartialName при выборе подходящей сборки первым делом просматривают каталог приложения, отдавая предпочтение private-сборкам.
Примечание: Размещение сборок в каталоге приложения считается предпочтительным. Такой способ помогает предотвратить взаимное влияние приложений – "кошмар DLL".
Динамическая загрузка сборки по полному пути к файлу позволяет загрузить любую сборку в системе (не только private- или из GAC).
Assembly a = Assembly.LoadFrom("D:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.Drawing.dll");
Однако этот способ недостаточно гибок и вряд ли стоит его широко применять.