程序集定位加载相关

摘要:
CLR通过GAC或CodeBase元素中指定的URL搜索强名称程序集。只要未指定CodeBase,CLR就会通过搜索专用路径来搜索强名称程序集。codeBase元素也可以用于弱命名程序集。在这种情况下,程序集的版本号被忽略,需要使用codeBase定义的版本号。在这种情况下,codeBaseURL必须是程序集根目录下的子目录。此策略文件告诉CLR在引用1.0.0.0程序集时加载2.0.0.0程序集。
简单配置

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

免责声明:文章转载自《程序集定位加载相关》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇170819-关于EL表达式的知识点C语言实现反射下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

纯前端版本号策略

近日在做的一个全静态项目,没有任何服务器逻辑,所以版本号策略也采用了纯前端的解决方案. 说实在话,其实都是被逼的,我只要修改一下服务器配置加简单的逻辑判断就可以了,但是后端工程师懒的搞,觉着巨复杂. 说到版本号,其实涉及到版本号有三个问题要考虑:版本发布问题 缓存和版本回滚问题 切换开发和维护环境的问题 其实方案很简单,类似于svn的版本策略,也就是如果有...

pom配置之:&amp;lt;distributionManagement&amp;gt;snapshot快照库和release发布库

本文转载自:  铁木箱子的mzone的博客: http://www.mzone.cc/article/277.html http://www.mzone.cc/article/279.html         在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布...

ubuntu18.04 当你的安装了cuda,程序跑着跑着,却崩溃了怎么办?(提示cuda没了)

前情提要:最近跑程序,突然有天提示cuda没了,具体大意是cuda没安装,但其实我已经安装好久了,而且程序也跑了很多次了,后来查明白,其原因有二: (1)linxu系统的不稳定性,经常会导致这样那样的问题。这样的时候一般是要重装了,缺啥装啥。 (2)Ubuntu18.04内核更新导致的。重新更换成旧内核就行。  网上搜索的教程连接如下:https://bl...

Android编程获取手机型号,本机*,sdk版本号及firmware版本号号(即系统版本号号)

Android开发平台中,可通过TelephonyManager 获取本机号码。 TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); txtPhoneNumber.setText(phoneMgr.getLine1Num...

泛泰A870(高通600 cpu 720p) 刷4.4专用中文recovery TWRP2.7.1.1版(三版通刷)

欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo crazyi(天下无雪) windxixi(雪狐) wangsai008 组成) 说说中文TWRP的简史:         中文TWRP是本人在20...

Git入门常用命令

Git是什么 Git是一个开源的[分布式][版本控制系统],用于敏捷高效地处理任何或小或大的项目,事实上它是与GitHub搭配起来使用的。Git 是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷...