最近一段时间在搜索延迟签名的一些问题时,看到网上很多的初学者对如何引用已经安装到GAC的程序集有很大的疑问,因此便有了这篇文章。
首先,我假设看这篇文章的小C们已经明白如何对程序集进行强命名,以及如何将程序集安装到GAC中。不清楚的话请先点击这里弄楚上面的问题。
- 将程序集安装到GAC后,在VS的添加引用的对话框中并不会出现该程序集。 例如我将my.dll这个程序集使用Gacutil -i my.dll注册到GAC后,在添加引用的对话框中我们并不能找到它,这是因为添加引用对话框中的程序集都是位于"C:/Program Files/Reference Assemblies/" 或 "C:/Windows/Microsoft.NET/Framework/版本号/"下,可以通过注册表增加类似的文件夹使得可以被添加引用对话框搜索到其下的程序集。感兴趣的同志可以自己在网上搜索下,这里我就不多说了。:)
- 需要大家明白一点,将程序集安装到GAC中主要是为了方便共享以及解决Dll hell的问题,并不适合在程序开发的过程中使用。那怎么样才能使用GAC中的程序集呢?这个不用你担心,Runtime会在GAC或指定目录中自动搜索所要引用的程序集。看完下面的例子相信大家就会明白了。
1)在VS中先创建一个ConsoleApplication项目ConsoleApplication1,再添加一个Class Library项目ClassLibrary1。
2)在cmd中定位到sn工具所在目录,再使用 sn -k myKey.snk 生成私钥,并拷贝到ClassLibrary1项目中。
3)复制以下代码到ClassLibrary1项目的class1.cs中,并build ClassLibrary1项目,得到ClassLibrary1.dll。





















4)复制以下代码到ConsoleApplication1项目的Program.cs中,添加引用->浏览->找到ClassLibrary3.dll->点击“确定”按钮,这一步很重要一定是要添加已编译好的ClassLibrary3.dll程序集。此时,build ConsoleApplication1项目,在项目所在目录的bin/debug目录下可以找到ConsoleApplication1.exe,ClassLibrary3.dll,运行ConsoleApplication1.exe程序可以正常运行。



















5)我们还是在第四步的目录中,将ClassLibrary3.dll删除,再运行ConsoleApplication1.exe会报错。原因大家都很清楚引用的程序集ClassLibrary3.dll已经不存在了。这时我们将ClassLibrary3.dll通过Gacutil -i ClassLibrary3.dll 将其安装到GAC中,再运行ConsoleApplication1.exe,这次程序正常运行。因为Runtime帮我们从GAC中找到了所要的程序集,但我们并没有给出任何的配置文件,Runtime是怎么找到它的呢?这点我也没有弄得很清楚,只知道程序集签名后会有一个唯一的名称来标识它,Runtime是根据这个标识来找到它的。有谁清楚的可以说说看。: )还有就是通过配置文件定制私有查找路径也可以让Runtime找到正确的程序集。这个东东大家网上搜搜吧。
至此,文章结束。发现有什么问题,提出来。