本篇體驗C#編譯器和CLR運行時如何查找程序集,并自定義CLR運行時查找程序集的方式。
□ C#編譯器和CLR運行時如何查找程序集
C#編譯器在哪里?
--在C:/Windows/Microsoft.NET/Framework/v4.0.30319中
→刪除F盤as文件夾中所有的exe和dll文件
→把上一篇全局程序集緩存文件夾(C:/Windows/Microsoft.NET/assembly/GAC_MSIL/Farm/v4.0_3.3.3.3__863de8402b3a9978)中的Farm.dll剪切拷貝到C:/Windows/Microsoft.NET/Framework/v4.0.30319文件夾中,即把Farm.dll放到C#編譯器csc.exe所在文件夾
現在,Farm.dll既不再全局程序集緩存文件夾,也不在F盤as文件夾中,和csc.exe在同一個文件夾中。
→F盤的as文件夾中也沒有Farm.dll
→重新編譯MainClass.cs
→但是,運行MainClass.exe,卻報錯
這說明:以上編譯成功,意味著C#編譯器能找到其所在文件夾內的Farm.dll程序集;但,CLR運行時卻"不認識"這個Farm.dll程序集。
因為,CLR運行時會到MainClass.exe所在的文件夾中去搜索Farm.dll,沒有搜尋到,所以報錯。
→現在把csc.exe所在文件夾的Farm.dll拷貝到F盤的as文件夾中
→再次運行MainClass.exe
這印證了:CLR運行時會在可執行文件所在文件夾搜尋程序集。
所以,
C#編譯器查找程序集的順序是:
1、在C#編譯器所在文件夾中查找
2、在全局程序集緩存文件夾中查找(該文件夾中的程序集必須是強名稱)
3、在可執行文件所在文件夾查找
CLR運行時查找程序集的順序是:
1、在全局程序集緩存文件夾中查找(該文件夾中的程序集必須是強名稱)
2、在可執行文件所在文件夾查找
□ 自定義CLR運行時查找程序集的方式
→查看F盤as文件夾中的當前文件
→創建MyAssemblies文件夾
→把Farm.dll移動到新創建的MyAssemblies文件夾
→運行MainClass.exe,發現報錯
→在as文件夾中創建MainClass.exe.config文件
→用記事本打開,編寫如下,保存
<?xml version="1.0" encoding="utf-8" ?><configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<PRobing privatePath="MyAssemblies" /></assemblyBinding></runtime></configuration>
總結:
○ .NET搜尋程序集的時候是忽略后綴的,即Farm.dll和Farm.exe一樣能被找到
○ C#編譯器和CLR運行時,查找程序集的方式有所不同
○ 在"可執行文件名稱.exe.config"中設置CLR運行時查找程序集的方式
“C#程序集系列”包括:
參考資料:
http://www.computersciencevideos.org/ created by Jamie King
新聞熱點
疑難解答