zoukankan      html  css  js  c++  java
  • 程序集定位加载相关

    简单配置

    1:指定自定义搜索目录

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

     mypath:必须在是应用程序的子目录

    高级配置

    <configuration>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <probing privatePath="AuxFiles;binsubdir" />
                <dependentAssembly>
                    <assemblyIdentity name="SomeClassLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/>
                    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
                    <codeBase version="2.0.0.0" href="http://www.Wintellect.com/SomeClassLibrary.dll" />
                </dependentAssembly>
                <dependentAssembly>
                    <assemblyIdentity name="TypeLib" publicKeyToken="1f2e74e897abbcfe" culture="neutral"/>
                    <bindingRedirect oldVersion="3.0.0.0-3.5.0.0" newVersion="4.0.0.0" />
                    <publisherPolicy apply="no" />
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
    </configuration>
    probing:查找应用程序的根目录下的 AuxFiles和binsubdir 目录,当尝试去查找弱命名程序集时。CLR是通过GAC或者CodeBase元素中指定的URL来查找强命名程序集的,只要当CodeBase没有指定的时候CLR才会通过查找私有路径来搜索强命名程序集。

    第一个dependentAssembly, assemblyIdentity, bindingRedirect:当尝试去加载无区域化信息且版本号为1.0.0.0,公钥为32ab4ba45e0a69a1的SomeClassLibrary的程序集时,使用版本号为2.0.0.0的同样程序集来代替coeBase元素:当尝试去加载无区域化信息且版本号为2.0.0.0,公钥为32ab4ba45e0a69a1的SomeClassLibrary的程序集时,尝试去通过下面的Url来加载:"http://www.Wintellect.com/SomeClassLibrary.dll"。codeBase元素同样可以用在弱命名程序集上面,这时程序集的版本号被忽略,而需要使用codeBase定义的版本号,同样这时的codeBaseURL必须是程序集根目录下的子目录。

    第二个dependentAssembly, assemblyIdentity, bindingRedirect:当尝试去加载无区域化信息且版本号为3.0.0.0到3.5.0.0,公钥为32ab4ba45e0a69a1的TypeLib的程序集时,使用版本号为4.0.0.0的程序集来代替。

    publisherPolicy element:如果程序集的发布者部署了一个发布者策略,CLR可以忽略它。

    发布者策略

     1:创建策略文件SomeClassLibrary.config

    <configuration>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="SomeClassLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/>
                    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
                    <codeBase version="2.0.0.0" href="http://www.Wintellect.com/SomeClassLibrary.dll"/>
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
    </configuration>

    发布者策略配置文件只能指定以上配置信息。(例如你不能指定 publisherPolicy或者Probing元素)

    这个策略文件告诉CLR当版本号为1.0.0.0的程序集被引用的时候加载版本为2.0.0.0的程序集来代替。

    2:创建包含该策略文件的发布策略程序集

    AL.exe  /out:Policy.1.0.SomeClassLibrary.dll 
        /version:1.0.0.0
        /keyfile:MyCompany.snk
        /linkresource:SomeClassLibrary.config

    /out:这个选项告诉AL.exe创建一个仅仅包含manifest的新的PE文件叫做Policy.1.0.SomeClassLibrary.dll.

    这个程序集的名字非常重要:

      名字的第一个部分"Policy"告诉CLR这个程序集包含发布者策略信息

      名字的第二和第三部分"1.0",告诉CLR这个策略程序集是提供给所有主次版本号为1.0的SomeClassLibrary的程序集,你不能为每一个Builds和revisions的程序集创建发布者策略。

      名字的第四部分"SomeClassLibrary",指定了这个策略应用的目标程序集。

      名字的第五部分"dll",只是产生的结果程序集的扩展名

    /version:这个选项标记发布者策略程序集的版本,这个版本号和SomeClassLibrary没有一点关系,正如你所见的发布者策略程序集也可以进行版本化,今天发布者创建了一个策略用来把版本号为1.0.0.0的SomeClassLibrary程序集导向版本号为2.0.0.0的程序集,将来发布者也许希望把版本号为1.0.0.0的SomeClassLibrary程序集导向版本号2.5.0.0,CLR通过这个版本号知道怎么获取最新的版本控制策略。

    /keyfile:指定签名文件(保证和SomeCLassLibrary使用同一个密钥对)(仅支持snk文件 如果密钥文件是VisualStudio文件需要转换(sn -p XXX.pfx  xxx.snk))

    /linkresource:告诉AL.exe Xm配置文件作为程序集的一部分,导致程序集包含两个文集,这两个文件都需要和新版的SomeClassLibrary一起打包部署给用户。注意:你不能使用 AL.exe /embedresource 选项来把XML配置文件嵌入进程序集中,是程序集成为一个文件,因为CLR要求XML文件作为一个分开的文件部署.

    发布者策略程序集必须被安装在GAC中,虽然新的SomeClassLibrary也同样何以安装在GAC中,但是它不必一定要这样,你同样可以把他部署在应用程序的根目录或者通过codeBaseUrl指定的其他目录。

    当需要忽略发布者策略时,可以使用如下代码:

    <publisherPolicy apply="no"/>

    这个元素可以作为assemblyBinding的子元素来应用到所有的程序集上,也可以作为dependentAssembly的子元素来应用在特定程序集上面。

  • 相关阅读:
    Oracle不常用SQL
    C# xml 读xml、写xml、Xpath、Xml to Linq、xml添加节点 xml修改节点
    Oracle常见错误:ORA-06550、ORA-00911、ORA-02085
    IIS设置允许跨域
    npm和yarn 切换为国内镜像(淘宝镜像)
    Wordpress 所有 hook 钩子
    【C#】WPF多线程登录需求中报错 “调用线程无法访问对象,因为另一个线程拥有该对象“
    【C#】 WPF 中WebBrowser拖动来移动窗口,改变窗口位置
    【Java】Hibernate一级缓存测试分析
    javac编译单文件、多文件引入jar包、-cp解决无法加载主类问题
  • 原文地址:https://www.cnblogs.com/grayguo/p/5335848.html
Copyright © 2011-2022 走看看