Обнаружение сборок в среде выполненияHow the Runtime Locates Assemblies

Для успешного развертывания приложения .NET Framework необходимо понимать, как среда CLR обнаруживает сборки, из которых состоит приложение, и выполняет привязку к ним.To successfully deploy your .NET Framework application, you must understand how the common language runtime locates and binds to the assemblies that make up your application. По умолчанию среда выполнения пытается выполнить привязку к той самой версии сборки, с помощью которой было создано приложение.By default, the runtime attempts to bind with the exact version of an assembly that the application was built with. Это поведение по умолчанию можно переопределить с помощью параметров файла конфигурации.This default behavior can be overridden by configuration file settings.

При попытке найти сборку и разрешить ссылку на нее среда CLR выполняет ряд действий.The common language runtime performs a number of steps when attempting to locate an assembly and resolve an assembly reference. Каждый этап подробно описывается в приведенных ниже разделах.Each step is explained in the following sections. Термин "проверка" часто используется при описании того, как среда выполнения ищет сборки. Под ним понимается набор эвристических правил, используемых для обнаружения сборки на основе ее имени и языка и региональных параметров.The term probing is often used when describing how the runtime locates assemblies; it refers to the set of heuristics used to locate the assembly based on its name and culture.

Примечание

Сведения о привязке можно просмотреть в файле журнала с помощью средства просмотра журнала привязок сборки (Fuslogvw.exe), которое включено в Windows SDK.You can view binding information in the log file using the Assembly Binding Log Viewer (Fuslogvw.exe), which is included in the Windows SDK.

Инициирование привязкиInitiating the Bind

Процесс обнаружения и привязки к сборке начинается, когда среда выполнения пытается разрешить ссылку на другую сборку.The process of locating and binding to an assembly begins when the runtime attempts to resolve a reference to another assembly. Эта ссылка может быть статической или динамической.This reference can be either static or dynamic. Компилятор записывает статические ссылки в метаданные манифеста сборки во время сборки.The compiler records static references in the assembly manifest's metadata at build time. Динамические ссылки создаются в режиме реального времени в результате вызова различных методов, таких как Assembly.Load.Dynamic references are constructed on the fly as a result of calling various methods, such as Assembly.Load.

Предпочтительным способом обращения к сборке является использование полной ссылки, включая имя, версию, язык и региональные параметры сборки и токен открытого ключа (при наличии).The preferred way to reference an assembly is to use a full reference, including the assembly name, version, culture, and public key token (if one exists). Среда выполнения использует эти сведения для обнаружения сборки с помощью описанных далее в этом разделе действий.The runtime uses this information to locate the assembly, following the steps described later in this section. Она использует один и тот же процесс разрешения независимо от того, указывает ли ссылка на статическую или динамическую сборку.The runtime uses the same resolution process regardless of whether the reference is for a static or dynamic assembly.

Динамическую ссылку на сборку также можно создать, предоставив вызывающему методу только часть сведений о сборке, например только ее имя.You can also make a dynamic reference to an assembly by providing the calling method with only partial information about the assembly, such as specifying only the assembly name. В этом случае сборка ищется только в каталоге приложения. Другие проверки не производятся.In this case, only the application directory is searched for the assembly, and no other checking occurs. Создать частичную ссылку можно с помощью различных методов загрузки сборок, таких как Assembly.Load или AppDomain.Load.You make a partial reference using any of the various methods for loading assemblies such as Assembly.Load or AppDomain.Load.

В заключение можно создать динамическую ссылку, используя метод, такой как Assembly.Load, и предоставить только частичные сведения; затем ссылку полностью определяют с помощью элемента <qualifyAssembly> в файле конфигурации приложения.Finally, you can make a dynamic reference using a method such as Assembly.Load and provide only partial information; you then qualify the reference using the <qualifyAssembly> element in the application configuration file. Этот элемент позволяет предоставлять полные данные ссылки (имя, версию, язык и региональные параметры и, при наличии, токен открытого ключа) в файле конфигурации приложения, а не в коде.This element allows you to provide the full reference information (name, version, culture and, if applicable, the public key token) in your application configuration file instead of in your code. Такой подход можно использовать, если требуется определить полную ссылку на сборку вне каталога приложения или сослаться на сборку в глобальном кэше сборок, используя преимущества определения полной ссылки в файле конфигурации, а не в коде.You would use this technique if you wanted to fully qualify a reference to an assembly outside the application directory, or if you wanted to reference an assembly in the global assembly cache but you wanted the convenience of specifying the full reference in the configuration file instead of in your code.

Примечание

Частичные ссылки этого типа не следует использовать для сборок, которые являются общими для нескольких приложений.This type of partial reference should not be used with assemblies that are shared among several applications. Так как параметры конфигурации применяются к приложениям, а не к сборкам, сведения об общей сборке, использующей такой тип частичной ссылки, потребуется включить в файлы конфигурации всех приложений, использующих эту сборку.Because configuration settings are applied per application and not per assembly, a shared assembly using this type of partial reference would require each application using the shared assembly to have the qualifying information in its configuration file.

Для разрешения ссылки на сборку среда выполнения выполняет указанные ниже действия.The runtime uses the following steps to resolve an assembly reference:

  1. Определяет правильную версию сборки , анализируя применимые файлы конфигурации, включая файл конфигурации приложения, файл политики издателя и файл конфигурации компьютера.Determines the correct assembly version by examining applicable configuration files, including the application configuration file, publisher policy file, and machine configuration file. Если файл конфигурации расположен на удаленном компьютере, сначала среде выполнения нужно найти и скачать файл конфигурации приложения.If the configuration file is located on a remote machine, the runtime must locate and download the application configuration file first.

  2. Проверяет, выполнялась ли привязка к имени сборки прежде , и если да, использует ранее загруженную сборку.Checks whether the assembly name has been bound to before and, if so, uses the previously loaded assembly. Если предыдущий запрос загрузки сборки закончился неудачей, запрос немедленно прерывается без попытки загрузить сборку.If a previous request to load the assembly failed, the request is failed immediately without attempting to load the assembly.

    Примечание

    Кэширование ошибок привязки к сборкам появилось в .NET Framework 2.0.The caching of assembly binding failures is new in the .NET Framework version 2.0.

  3. Проверяет глобальный кэш сборок.Checks the global assembly cache. Если в нем удается найти сборку, среда выполнения использует ее.If the assembly is found there, the runtime uses this assembly.

  4. Проверяет наличие сборки , выполняя указанные ниже действия.Probes for the assembly using the following steps:

    1. Если конфигурация и политика издателя не влияют на исходную ссылку и запрос привязки создан с помощью метода Assembly.LoadFrom , среда выполнения пытается найти косвенные упоминания о расположении сборки.If configuration and publisher policy do not affect the original reference and if the bind request was created using the Assembly.LoadFrom method, the runtime checks for location hints.

    2. Если база кода находится в файлах конфигурации, среда выполнения проверяет только это расположение.If a codebase is found in the configuration files, the runtime checks only this location. Если происходит сбой проверки, среда выполнения определяет, что запрос привязки не выполнен, и другие проверки не производятся.If this probe fails, the runtime determines that the binding request failed and no other probing occurs.

    3. Проверяет наличие сборки с помощью эвристических правил, описанных в разделе, посвященном проверке.Probes for the assembly using the heuristics described in the probing section. Если сборку не удается найти с помощью проверки, среда выполнения запрашивает предоставление сборки у установщика Windows.If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. Эта операция напоминает функцию установки по запросу.This acts as an install-on-demand feature.

      Примечание

      Если сборки не являются сборками со строгими именами, для них не проводятся ни проверка версии, ни поиск в глобальном кэше сборок.There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

Шаг 1. Проверка файлов конфигурацииStep 1: Examining the Configuration Files

Поведение привязки сборок можно настроить на разных уровнях, используя три XML-файла:Assembly binding behavior can be configured at different levels based on three XML files:

  • файл конфигурации приложения;Application configuration file.

  • файл политики издателя;Publisher policy file.

  • файл конфигурации компьютера.Machine configuration file.

Эти файлы имеют одинаковый синтаксис и содержат такие сведения, как перенаправления привязки, расположение кода и режимы привязки для конкретных сборок.These files follow the same syntax and provide information such as binding redirects, the location of code, and binding modes for particular assemblies. Каждый файл конфигурации может содержать элемент <assemblyBinding, перенаправляющий процесс привязки.Each configuration file can contain an <assemblyBinding> element that redirects the binding process. Дочерние элементы элемента <assemblyBinding> включают элемент <dependentAssembly>.The child elements of the <assemblyBinding> element include the <dependentAssembly> element. Дочерние элементы элемента <dependentAssembly> включают элемент <assemblyIdentity>, элемент <bindingRedirect> и элемент <codeBase>.The children of <dependentAssembly> element include the <assemblyIdentity> element, the <bindingRedirect> element, and the <codeBase> element.

Примечание

Сведения о конфигурации хранятся во всех трех файлах конфигурации, но не все элементы можно использовать во всех этих файлах.Configuration information can be found in the three configuration files; not all elements are valid in all configuration files. Например, сведения о режиме привязки и частном пути могут находиться только в файле конфигурации приложения.For example, binding mode and private path information can only be in the application configuration file. Полный список сведений, которые содержатся в каждом файле, см. в разделе Настройка приложений с использованием файлов конфигурации.For a complete list of the information that is contained in each file, see Configuring Apps by Using Configuration Files.

Файл конфигурации приложенияApplication Configuration File

В первую очередь среда CLR пытается найти в файле конфигурации приложения данные, которые переопределяют сведения о версии, хранящиеся в манифесте вызывающей сборки.First, the common language runtime checks the application configuration file for information that overrides the version information stored in the calling assembly's manifest. Файл конфигурации приложения можно развертывать вместе с приложением, но он не требуется для выполнения приложения.The application configuration file can be deployed with an application, but is not required for application execution. Обычно получение этого файла происходит почти мгновенно, однако если приложение размещено на удаленном компьютере, например при работе с веб-приложением через Internet Explorer, файл конфигурации необходимо скачивать.Usually the retrieval of this file is almost instantaneous, but in situations where the application base is on a remote computer, such as in an Internet Explorer Web-based scenario, the configuration file must be downloaded.

В случае клиентских приложений файл конфигурации приложения расположен в том же каталоге, что и исполняемый файл приложения, и имеет такое же базовое имя, но с расширением CONFIG.For client executables, the application configuration file resides in the same directory as the application's executable and has the same base name as the executable with a .config extension. Например, файл конфигурации для C:\Program Files\Myapp\Myapp.exe называется C:\Program Files\Myapp\Myapp.exe.config. В случае работы через браузер в HTML-файле должен быть элемент <link> , явным образом указывающий на файл конфигурации.For example, the configuration file for C:\Program Files\Myapp\Myapp.exe is C:\Program Files\Myapp\Myapp.exe.config. In a browser-based scenario, the HTML file must use the <link> element to explicitly point to the configuration file.

Ниже показан пример кода простого файла конфигурации приложения.The following code provides a simple example of an application configuration file. В этом примере элемент TextWriterTraceListener добавляется в коллекцию Listeners , чтобы включить запись отладочной информации в файл.This example adds a TextWriterTraceListener to the Listeners collection to enable recording debug information to a file.

<configuration>
   <system.diagnostics>
      <trace useGlobalLock="false" autoflush="true" indentsize="0">
         <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
         </listeners>
      </trace>
   </system.diagnostics>
</configuration>

Файл политики издателяPublisher Policy File

Во вторую очередь среда выполнения проверяет файл политики издателя, если он существует.Second, the runtime examines the publisher policy file, if one exists. Файлы политики издателя распространяются издателем компонента в виде исправлений или обновлений для общего компонента.Publisher policy files are distributed by a component publisher as a fix or update to a shared component. Они содержат предоставляемые издателем сведения о совместимости, которые задают ссылки на новые версии сборок.These files contain compatibility information issued by the publisher of the shared component that directs an assembly reference to a new version. В отличие от файлов конфигурации компьютера и приложения файлы политики издателя хранятся в своей собственной сборке, которая должна быть установлена в глобальном кэше сборок.Unlike application and machine configuration files, publisher policy files are contained in their own assembly that must be installed in the global assembly cache.

Ниже приведен пример файла конфигурации политики издателя.The following is an example of a Publisher Policy configuration file:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

            <dependentAssembly>
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>
            </dependentAssembly>

        </assemblyBinding>
    </runtime>
</configuration>

Чтобы создать сборку, можно воспользоваться компоновщиком сборок (Al.exe) и выполнить команду следующего вида:To create an assembly, you can use the Al.exe (Assembly Linker) tool with a command such as the following:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0

compatkey.dat — это файл ключа строгого имени.compatkey.dat is a strong-name key file. Эта команда создает сборку со строгим именем, которую можно поместить в глобальный кэш сборок.This command creates a strong-named assembly you can place in the global assembly cache.

Примечание

Политика издателя затрагивает все приложения, которые используют общий компонент.Publisher policy affects all applications that use a shared component.

Файл конфигурации политики издателя переопределяет сведения о версии, которые поступают от приложения (то есть из манифеста сборки или из файла конфигурации приложения).The publisher policy configuration file overrides version information that comes from the application (that is, from the assembly manifest or from the application configuration file). Если в файле конфигурации приложения нет оператора перенаправления версии, указанной в манифесте сборки, файл политики издателя переопределяет версию, указанную в манифесте сборки.If there is no statement in the application configuration file to redirect the version specified in the assembly manifest, the publisher policy file overrides the version specified in the assembly manifest. Однако если такой оператор имеется, политика издателя переопределяет эту версию, а не версию, указанную в манифесте.However, if there is a redirecting statement in the application configuration file, publisher policy overrides that version rather than the one specified in the manifest.

Файл политики издателя используется, если общий компонент обновляется и нужно, чтобы все использующие его приложения получили его новую версию.A publisher policy file is used when a shared component is updated and the new version of the shared component should be picked up by all applications using that component. Параметры в файле политики издателя переопределяют параметры в файле конфигурации приложения, если только в файле конфигурации приложения не задан безопасный режим.The settings in the publisher policy file override settings in the application configuration file, unless the application configuration file enforces safe mode.

Безопасный режимSafe Mode

Файлы политики издателя обычно явным образом устанавливаются как часть пакета обновления или обновления программы.Publisher policy files are usually explicitly installed as part of a service pack or program update. В случае возникновения проблем с обновленным общим компонентом можно проигнорировать изменения в файле политики издателя, используя безопасный режим.If there is any problem with the upgraded shared component, you can ignore the overrides in the publisher policy file using safe mode. Безопасный режим определяется элементом <publisherPolicy apply="yes|no"/> , расположенным только в файле конфигурации приложения.Safe mode is determined by the <publisherPolicy apply="yes|no"/> element, located only in the application configuration file. Он указывает, следует ли удалять сведения политики издателя из процесса привязки.It specifies whether the publisher policy configuration information should be removed from the binding process.

Безопасный режим можно задать для всего приложения или для выбранных сборок.Safe mode can be set for the entire application or for selected assemblies. То есть можно отключить политику для всех сборок, составляющих приложение, или включить ее для некоторых сборок, отключив для других.That is, you can turn off the policy for all assemblies that make up the application, or turn it on for some assemblies but not others. Чтобы применить политику издателя на уровне отдельных сборок приложения, установите параметр <publisherPolicy apply=no/> и с помощью элемента <dependentAssembly> укажите сборки, на которые должно распространяться действие политики.To selectively apply publisher policy to assemblies that make up an application, set <publisherPolicy apply=no/> and specify which assemblies you want to be affected using the <dependentAssembly> element. Чтобы применить политику издателя ко всем сборкам приложения, установите параметр <publisherPolicy apply=no/> без элементов зависимых сборок.To apply publisher policy to all assemblies that make up the application, set <publisherPolicy apply=no/> with no dependent assembly elements. Дополнительные сведения о конфигурации см. в разделе Настройка приложений с использованием файлов конфигурации.For more about configuration, see Configuring Apps by using Configuration Files.

Файл конфигурации компьютераMachine Configuration File

Файл конфигурации компьютера среда выполнения проверяет последним.Third, the runtime examines the machine configuration file. Этот файл с именем Machine.config находится на локальном компьютере в подкаталоге Config корневого каталога, где установлена среда выполнения.This file, called Machine.config, resides on the local computer in the Config subdirectory of the root directory where the runtime is installed. С помощью этого файла администраторы могут настраивать ограничения привязки сборок, действующие только на этом компьютере.This file can be used by administrators to specify assembly binding restrictions that are local to that computer. Параметры в файле конфигурации компьютера имеют приоритет над всеми остальными параметрами. Однако это не означает, что все параметры конфигурации должны быть помещены в этот файл.The settings in the machine configuration file take precedence over all other configuration settings; however, this does not mean that all configuration settings should be put in this file. Версия, определяемая файлом политики администратора, является окончательной и не может быть переопределена.The version determined by the administrator policy file is final, and cannot be overridden. Переопределения, заданные в файле Machine.config, влияют на все приложения.Overrides specified in the Machine.config file affect all applications. Дополнительные сведения о файлах конфигурации см. в разделе Настройка приложений с использованием файлов конфигурации.For more information about configuration files, see Configuring Apps by using Configuration Files.

Шаг 2. Проверка наличия предыдущих ссылок на сборкиStep 2: Checking for Previously Referenced Assemblies

Если запрошенная сборка уже запрашивалась в предыдущих вызовах, среда CLR использует уже загруженную сборку.If the requested assembly has also been requested in previous calls, the common language runtime uses the assembly that is already loaded. Это может иметь последствия при именовании сборок, составляющих приложение.This can have ramifications when naming assemblies that make up an application. Подробнее об именовании сборок см. в разделе Имена сборок.For more information about naming assemblies, see Assembly Names.

Если предыдущий запрос сборки завершился неудачей, последующие вызовы этой сборки немедленно прерываются без попытки загрузить сборку.If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. Начиная с .NET Framework версии 2.0 сбои привязки сборок кэшируются, и кэшированные сведения используются для определения целесообразности попытки загрузить сборку.Starting with the .NET Framework version 2.0, assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly.

Примечание

Чтобы вернуться к алгоритму поведения, характерному для .NET Framework версий 1.0 и 1.1, в котором сбои привязки не кэшировались, включите в файл конфигурации элемент <disableCachingBindingFailures>.To revert to the behavior of the .NET Framework versions 1.0 and 1.1, which did not cache binding failures, include the <disableCachingBindingFailures> Element in your configuration file.

Шаг 3. Проверка глобального кэша сборокStep 3: Checking the Global Assembly Cache

Для сборок со строгими именами процесс привязки продолжается поиском в глобальном кэше сборок.For strong-named assemblies, the binding process continues by looking in the global assembly cache. В глобальном кэше сборок сохраняются сборки, которые могут использоваться на компьютере несколькими приложениями.The global assembly cache stores assemblies that can be used by several applications on a computer. Все сборки в глобальном кэше сборок должны иметь строгие имена.All assemblies in the global assembly cache must have strong names.

Шаг 4. Обнаружение сборки с помощью базы кода или проверкиStep 4: Locating the Assembly through Codebases or Probing

После определения правильной версии сборки с помощью сведений в ссылке вызывающей сборки и в файлах конфигурации, а также после проверки в глобальном кэше сборок (только для сборок со строгими именами) среда CLR попытается найти сборку.After the correct assembly version has been determined by using the information in the calling assembly's reference and in the configuration files, and after it has checked in the global assembly cache (only for strong-named assemblies), the common language runtime attempts to find the assembly. Процесс поиска расположения сборки включает в себя перечисленные ниже этапы.The process of locating an assembly involves the following steps:

  1. Если элемент <codeBase> найден в файле конфигурации приложения, среда выполнения проверяет указанное местоположение.If a <codeBase> element is found in the application configuration file, the runtime checks the specified location. Если найдено совпадение, используется эта сборка, и дальнейший поиск не выполняется.If a match is found, that assembly is used and no probing occurs. Если сборку не удается обнаружить в этом файле, происходит сбой запроса привязки.If the assembly is not found there, the binding request fails.

  2. Среда выполнения осуществляет проверку наличия связанной сборки, используя правила, описанные далее в этом разделе.The runtime then probes for the referenced assembly using the rules specified later in this section.

Примечание

Если в каталоге имеется несколько версий сборки и требуется сослаться на конкретную версию сборки, необходимо использовать элемент <codeBase> вместо атрибута privatePath элемента <probing>.If you have multiple versions of an assembly in a directory and you want to reference a particular version of that assembly, you must use the <codeBase> element instead of the privatePath attribute of the <probing> element. Если используется элемент <probing>, среда выполнения останавливает проверку при первом обнаружении сборки, у которой совпадает упоминаемое в ссылке простое имя сборки независимо от того, является ли совпадение точным или нет.If you use the <probing> element, the runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Если совпадение точное, найденная сборка используется.If it is a correct match, that assembly is used. Если совпадение не является точным, проверка прекращается и происходит сбой привязки.If it is not a correct match, probing stops and binding fails.

Обнаружение сборки с помощью базы кодаLocating the Assembly through Codebases

Сведения базы кода могут предоставляться с помощью элемента <codeBase> в файле конфигурации.Codebase information can be provided by using a <codeBase> element in a configuration file. Эта база кода всегда проверяется, прежде чем среда выполнения переходит к проверке наличия связанной сборки.This codebase is always checked before the runtime attempts to probe for the referenced assembly. Если файл политики издателя, содержащий переадресацию конечной версии, содержит также элемент <codeBase>, используется этот элемент <codeBase>.If a publisher policy file containing the final version redirect also contains a <codeBase> element, that <codeBase> element is the one that is used. Например, если в файле конфигурации приложения указан элемент <, и файл политики издателя, переопределяющий сведения приложения, также содержит элемент <codeBase>, используется элемент <codeBase> из файла политики издателя.For example, if your application configuration file specifies a <codeBase> element, and a publisher policy file that is overriding the application information also specifies a <codeBase> element, the <codeBase> element in the publisher policy file is used.

Если совпадение не найдено в местоположении, заданном элементом <codeBase>, запрос привязки завершается неудачей и никакие дополнительные действия не предпринимаются.If no match is found at the location specified by the <codeBase> element, the bind request fails and no further steps are taken. Если среда выполнения определяет, что сборка соответствует критерию вызывающей сборки, то используется эта сборка.If the runtime determines that an assembly matches the calling assembly's criteria, it uses that assembly. Когда загружается файл, указанный заданным элементом <codeBase>, среда выполнения проверяет совпадение имени, версии, языка, региональных параметров и открытого ключа с соответствующими параметрами ссылки вызывающей сборки.When the file specified by the given <codeBase> element is loaded, the runtime checks to make sure that the name, version, culture, and public key match the calling assembly's reference.

Примечание

Связанные сборки вне корневого каталога приложения должны иметь строгие имена и должны быть установлены в глобальном кэше сборок или заданы с помощью элемента <codeBase>.Referenced assemblies outside the application's root directory must have strong names and must either be installed in the global assembly cache or specified using the <codeBase> element.

Обнаружение сборки с помощью проверкиLocating the Assembly through Probing

Если в файле конфигурации приложения нет элемента <codeBase>, среда выполнения проверяет наличие сборки, используя следующие четыре критерия.If there is no <codeBase> element in the application configuration file, the runtime probes for the assembly using four criteria:

  • Базовая папка приложения, то есть корневой каталог, где выполняется приложение.Application base, which is the root location where the application is being executed.

  • Язык и региональные параметры, то есть атрибут culture сборки, на которую задана ссылка.Culture, which is the culture attribute of the assembly being referenced.

  • Имя, то есть имя сборки, на которую задана ссылка.Name, which is the name of the referenced assembly.

  • Атрибут privatePath элемента <probing>, который является определяемым пользователем списком подкаталогов в корневой папке.The privatePath attribute of the <probing> element, which is the user-defined list of subdirectories under the root location. Это расположение может быть задано в файле конфигурации приложения и в управляемом коде с помощью свойства AppDomainSetup.PrivateBinPath для домена приложения.This location can be specified in the application configuration file and in managed code using the AppDomainSetup.PrivateBinPath property for an application domain. При указании в управляемом коде путь privatePath управляемого кода проверяется первым. Затем проверяется путь, указанный в файле конфигурации приложения.When specified in managed code, the managed code privatePath is probed first, followed by the path specified in the application configuration file.

Проверка базовой папки приложения и каталогов языков и региональных параметровProbing the Application Base and Culture Directories

Среда выполнения всегда начинает проверку с базовой папки приложения, которая может быть URL-адресом или корневым каталогом приложения на компьютере.The runtime always begins probing in the application's base, which can be either a URL or the application's root directory on a computer. Если связанная сборка не найдена в базовой папке приложения и не предоставлены сведения о языке и региональных параметрах, среда выполнения осуществляет поиск во всех подкаталогах с именем сборки.If the referenced assembly is not found in the application base and no culture information is provided, the runtime searches any subdirectories with the assembly name. В число проверяемых каталогов входят следующие:The directories probed include:

  • [базовая папка приложения] / [имя сборки].dll[application base] / [assembly name].dll

  • [базовая папка приложения] / [имя сборки] / [имя сборки].dll[application base] / [assembly name] / [assembly name].dll

Если указаны сведения о языке и региональных параметрах, проверяются только следующие каталоги:If culture information is specified for the referenced assembly, only the following directories are probed:

  • [базовая папка приложения] / [язык и региональные параметры] / [имя сборки].dll[application base] / [culture] / [assembly name].dll

  • [базовая папка приложения] / [язык и региональные параметры] / [имя сборки] / [имя сборки].dll[application base] / [culture] / [assembly name] / [assembly name].dll

Проверка с помощью атрибута privatePathProbing with the privatePath Attribute

Помимо подкаталогов языков и региональных параметров и подкаталогов, называемых по связанной сборке, среда выполнения проверяет также каталоги, задаваемые с помощью атрибута privatePath элемента <probing>.In addition to the culture subdirectories and the subdirectories named for the referenced assembly, the runtime also probes directories specified using the privatePath attribute of the <probing> element. Каталоги, заданные с помощью атрибута privatePath , должны быть подкаталогами корневого каталога приложения.The directories specified using the privatePath attribute must be subdirectories of the application's root directory. Проверяемые каталоги зависят от того, включены ли сведения о языке и региональных параметрах в запрос связанной сборки.The directories probed vary depending on whether culture information is included in the referenced assembly request.

Среда выполнения останавливает проверку при первом обнаружении сборки, у которой совпадает упоминаемое в ссылке простое имя сборки, независимо от того, является ли совпадение точным или нет.The runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Если совпадение точное, найденная сборка используется.If it is a correct match, that assembly is used. Если совпадение не является точным, проверка прекращается и происходит сбой привязки.If it is not a correct match, probing stops and binding fails.

Если язык и региональные параметры включены, проверяются следующие каталоги:If culture is included, the following directories are probed:

  • [базовая папка приложения] / [binpath] / [язык и региональные параметры] / [имя сборки].dll[application base] / [binpath] / [culture] / [assembly name].dll

  • [базовая папка приложения] / [binpath] / [язык и региональные параметры] / [имя сборки] / [имя сборки].dll[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll

Если язык и региональные параметры не включены, проверяются следующие каталоги:If culture information is not included, the following directories are probed:

  • [базовая папка приложения] / [binpath] / [имя сборки].dll[application base] / [binpath] / [assembly name].dll

  • [базовая папка приложения] / [binpath] / [имя сборки] / [имя сборки].dll[application base] / [binpath] / [assembly name] / [assembly name].dll

Примеры проверкиProbing Examples

Заданы следующие сведения:Given the following information:

  • Имя сборки, на которую указывает ссылка: myAssemblyReferenced assembly name: myAssembly

  • Корневой каталог приложения: http://www.code.microsoft.comApplication root directory: http://www.code.microsoft.com

  • Значение элемента <probing> в файле конфигурации: bin<probing> element in configuration file specifies: bin

  • Язык и региональные параметры: deCulture: de

Среда выполнения проверяет следующие URL-адреса:The runtime probes the following URLs:

  • http://www.code.microsoft.com/de/myAssembly.dll

  • http://www.code.microsoft.com/de/myAssembly/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll

Несколько сборок с одинаковыми именамиMultiple Assemblies with the Same Name

В примере ниже показано, как настроить несколько сборок с одинаковыми именами.The following example shows how to configure multiple assemblies with the same name.

<dependentAssembly>
   <assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
   <codeBase version="1.0.0.0" href="v1/Server.dll" />
   <codeBase version="2.0.0.0" href="v2/Server.dll" />
</dependentAssembly>

Другие проверяемые расположенияOther Locations Probed

Расположение сборки также может быть установлено с помощью текущего контекста привязки.Assembly location can also be determined using the current binding context. Это часто происходит при использовании метода Assembly.LoadFrom и в сценариях COM-взаимодействия.This most often occurs when the Assembly.LoadFrom method is used and in COM interop scenarios. Если сборка использует метод LoadFrom для ссылки на другую сборку, расположение вызывающей сборки считается подсказкой для поиска расположения сборки, на которую задана ссылка.If an assembly uses the LoadFrom method to reference another assembly, the calling assembly's location is considered to be a hint about where to find the referenced assembly. Если удается найти совпадение, эта сборка загружается.If a match is found, that assembly is loaded. Если совпадение не найдено, среда выполнения продолжает поиск в соответствии с семантикой, а затем запрашивает установщик Windows о предоставлении сборки.If no match is found, the runtime continues with its search semantics and then queries the Windows Installer to provide the assembly. Если не удается предоставить сборку, соответствующую запросу привязки, создается исключение.If no assembly is provided that matches the binding request, an exception is thrown. Это исключение TypeLoadException в управляемом коде, если была задана ссылка на тип, или FileNotFoundException , если загружаемая сборка не найдена.This exception is a TypeLoadException in managed code if a type was referenced, or a FileNotFoundException if an assembly being loaded was not found.

Например, если сборка Assembly1 ссылается на сборку Assembly2 и сборка Assembly1 была скачана с адреса http://www.code.microsoft.com/utils, это расположение считается подсказкой для поиска Assembly2.dll.For example, if Assembly1 references Assembly2 and Assembly1 was downloaded from http://www.code.microsoft.com/utils, that location is considered to be a hint about where to find Assembly2.dll. После этого среда выполнения проверяет наличие сборки в http://www.code.microsoft.com/utils/Assembly2.dll и http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll.The runtime then probes for the assembly in http://www.code.microsoft.com/utils/Assembly2.dll and http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Если сборка Assembly2 не обнаружена ни в одном из этих расположений, среда выполнения отправляет запрос установщику Windows.If Assembly2 is not found at either of those locations, the runtime queries the Windows Installer.

См. такжеSee also