zoukankan      html  css  js  c++  java
  • CLR How the Runtime Locates Assemblies

    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.

    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.

    NoteNote

    You can view binding information in the log file using the Assembly Binding Log Viewer (Fuslogvw.exe), which is included in the Windows Software Development Kit (SDK).

    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. Dynamic references are constructed on the fly as a result of calling various methods, such as System.Reflection.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. You make a partial reference using any of the various methods for loading assemblies such as System.Reflection.Assembly.Load or System.AppDomain.Load.

    Finally, you can make a dynamic reference using a method such as System.Reflection.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.

    NoteNote

    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.

      NoteNote

      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. 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. 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.

        NoteNote

        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.

    http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.100).aspx

  • 相关阅读:
    有理想的程序员必须知道的15件事
    C#是唯一能挑战Java的编程语言?
    ADO.NET Entity Framework 如何:定义具有修改存储过程的模型(实体框架)
    Android sqlite3工具的使用
    SQLite管理工具
    在 Android 应用程序中使用 Internet 数据 解析 XML、JSON 和 protocol buffers 数据
    2011年1月编程排行榜:PHP表现不佳,Python夺冠
    NoSQL开篇——为什么要使用NoSQL
    Windows 7任务栏与站点的集成
    Apache中 RewriteCond 规则参数介绍
  • 原文地址:https://www.cnblogs.com/LeoTang/p/2956604.html
Copyright © 2011-2022 走看看