程序集定位加载相关

简单配置

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的子元素来应用在特定程序集上面。

原文地址:https://www.cnblogs.com/grayguo/p/5335848.html