20分钟读懂程序集(2)
<div><p>三。程序集的分类</p><p>程序集分为私有程序集和共享程序集</p><p>3.1私有程序集。</p><p>(1)啥是私有程序集。顾名思义,私 就是 私有的意思。就是我们新建的项目库中保留的dll 都是私有程序集。比如,在我其中一个MyTestConsle的项目,在Bin/Debug里面都是私有程序集。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>
</p><p>(2)配置私有程序集(probing 属性)</p><p>一般情况下,我们需要dll,直接copy过去,是的,这样很方便。但是,有的时候,我们需要把dll放到不同的文件中,那么这个时候,就需要进行配置。别担心,特别的简单哦。</p><p>比如,我们在C盘下面新建一个 MyTest的文件夹。我把刚的2个程序拷到这里来,并且点击MyTestProject.exe,Ok,可以运行 这样没问题。。</p><p>
</p><p>但是,如果我新建一个“MyAllLibraries”文件夹,把我的Lanny.dll 文件放进去,如下图,那我运行,我们都知道 肯定会报错</p><p>
</p><p>咋办呢?这个时候就需要我们去配置了。我们在MyTestProject.exe同级下新建一个“MyTestProject.exe.config”文件。入下图:</p><p>
</p><p>MyTestProject.exe.config的内容是:</p><pre> </pre><ol> <li><?xml version="1.0" encoding="utf-8" ?> </li> <li><configuration> </li> <li> <runtime> </li> <li> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> </li> <li> <probing privatePath="MyAllLibraries" /> </li> <li> </assemblyBinding> </li> <li> </runtime> </li> <li></configuration> </li></ol><p>特别好理解,就是指明程序如果没有找到这个dll文件,那么我去哪里寻找。。。这样,我们就能顺利运行了。不截图了。</p><p>(3)使用VS IDE 进行配置</p><p>
</p><p>我们能新建Application Configuration File,然后进行配置。这个时候,它会自动把更新的内容更新到相应的 程序名.exe.config中。。</p><p>3.2共享程序集</p><p> (1)了解共享程序集</p><p>上一节中,我们梳理了下私有程序集,现在我们说下共享程序集。那么它们之间最大的区别是什么呢?它们的本质区别是共享程序集的一个副本可供一台机器上的多个应用程序使用。</p><p>比 如,我现在新建一个 Windows Forms的程序,里面有一个“MessageBox.Show()”方法,可是很遗憾,你没法再你新创建的应用程序下面找 到:System.Windows.Forms.dll的引用,为啥?因为它是共享的程序集。不信 你看下图,我没骗你把。</p><p>
</p><p>那么共享文件部署到哪里呢?它安装在GAC(Globle Assemble Cache)中,这个GAC 在下面的目录中。</p><p>
</p></div>
</div><p>程序集分为2类,私有程序集和共享程序集。</p><p>CLR 首部信息:运行于.NET 的程序都是需要这个标志哦!~如果需要查看它,也很简单,</p><blockquote><p>打开VS的命令行工具 然后输入</p><p>dumpbin/clrheaders 项目名称</p></blockquote><p>元数据:元素就是.NET 编译后的语言,我们可以打开ILDASM.exe 工具进行查看,然后再按Ctrl +M 打开元数据查看:</p><p>
</p><p>程序集清单:就是记录这个程序包含了哪些dll程序以及这个版本是啥等等。。。</p><p>二.单文件程序集和多文件程序集</p><p>2.1单文件程序集</p><p>我们大多数的情况用的都是单文件程序集哦!。这个特别好理解,比如我们新建一个类库工程,然后进行编译,一般来说,编译之后我们会得到一个 *.dll的文件,ok,这个就是单文件程序集啦!~</p><p>2.1多文件程序集</p><p>好,我们来说说多文件程序集。我们得知道,程序集由什么构成?是模块。所以,多文件程序集就是有多个模块构成的程序集。很遗憾的是,如果我们需要构建多文件程序集,VS IDE 是没法做的,只能通过命令行的csc.exe 命令进行。真辛苦~~~。</p><p>(1)在记事本里 写一段简单的code,如下:</p><pre> </pre><ol> <li>using System; </li> <li> </li> <li>namespace Person </li> <li>{ </li> <li> public class China </li> <li> { </li> <li> public void DisplayChinese() </li> <li> { </li> <li> Console.WriteLine("I'm Chinese"); </li> <li> } </li> <li> } </li> <li>} </li></ol><p>然后,打开你VS 命令行,把上面的生成一个模块,命令如下:</p><blockquote><p>csc.exe /t:module China.cs</p></blockquote><p>我们能看到生成了一个:China.netmodule的模块文件。</p><p>(2),接着我们在新建一个文件,并且这个文件生成是dll文件。</p><pre> </pre><ol> <li>using System; </li> <li> </li> <li>namespace Person </li> <li>{ </li> <li> public class Japan </li> <li> { </li> <li> public void DisplayJapanese() </li> <li> { </li> <li> Console.WriteLine("I'm Japanese"); </li> <li> } </li> <li> } </li> <li>} </li></ol><p>(3)把刚China.netmodule模块加入到刚需要生成的dll文件中。</p><p>命令是:</p><blockquote><p>csc.exe /t:library /out:Lanny.dll Japan.cs /addmodule:China.netmodule</p></blockquote><p>我们能看到生成了一个Lanny.dll的文件。。我们可以把这个文件引入到程序中进行测试。Ok,我们一个多文件程序集就这样程序。但是,我感觉这样的用处不大。</p><pre> </pre><ol> <li>Japan j = new Japan(); </li> <li> j.DisplayJapanese(); </li> <li> Console.ReadKey(); </li></ol><p>能弹出“I'm Japanese”,说明我们引用成功了。</p></div>



