1. 程式人生 > >C#程式集Assembly學習隨筆(第一版)_AX

C#程式集Assembly學習隨筆(第一版)_AX

①什麼是程式集?
可以把程式集簡單理解為你的.NET專案在編譯後生成的*.exe或*.dll檔案.
嗯,這個確實簡單了些,但我是這麼理解的.詳細:
http://blog.csdn.net/sws8327/archive/2006/09/21/1244642.aspx

②程式集和名稱空間的區別?
一個程式集可以跨越n個名稱空間,一個名稱空間也可以包含n個程式集.(估計你該暈了)

如果說名稱空間是類庫的邏輯組織形式,那麼程式集就是類庫的物理組織形式。只有同時指定型別所在的名稱空間及實現該型別的程式集,才能完全限定該型別。(摘抄自《精通.NET核心技術--原來與架構》   電子工業出版社)

也就是說,你要建立一個類的例項,必須知道該類的  名稱空間(這個一般都知道)+程式集(這個很容易被我們忽略,因為一般我們不需要引用外部的程式集,如果你用C#做過Excel檔案的匯入匯出,就會知道必須新增一個Excel相關的程式集引用)

③怎樣通過命令列建立程式集?
我對命令列向來反感,如果你想知道,look here:

http://www.cnblogs.com/3echo/archive/2006/02/14/330579.html

④我怎麼把專案和程式集聯絡起來理解?
一個專案對應一個程式集.專案名與程式集名相同(03版,05版亂七八糟,隨機生成的程式集名).
一般的我們每建立一個.NET專案(ASP.NET(VS2005裡沒有),WinForm,類庫,控制檯等),IDE都會自動生成一個AssemblyInfo.cs的檔案,開啟看看(03版)

  1using System.Reflection;
 2using System.Runtime.CompilerServices;
 3
 4//
 5// 有關程式集的常規資訊是通過下列
 6// 屬性集控制的。更改這些屬性值可修改與程式集
 7// 關聯的資訊。
 8//
 9[assembly: AssemblyTitle("")]
10[assembly: AssemblyDescription("")]
11[assembly: AssemblyConfiguration("")]
12[assembly: AssemblyCompany("")]
13[assembly: AssemblyProduct("")]
14[assembly: AssemblyCopyright("")]
15[assembly: AssemblyTrademark("")]
16[assembly: AssemblyCulture("")]        
17
18//
19// 程式集的版本資訊由下列 4 個值組成:
20//
21//      主版本
22//      次版本 
23//      內部版本號
24//      修訂號
25//
26// 您可以指定所有這些值,也可以使用“修訂號”和“內部版本號”的預設值,方法是按
27// 如下所示使用 '*':
28
29[assembly: AssemblyVersion("1.0.*")]
30
31//
32// 要對程式集進行簽名,必須指定要使用的金鑰。有關程式集簽名的更多資訊,請參考 
33// Microsoft .NET Framework 文件。
34//
35// 使用下面的屬性控制用於簽名的金鑰。
36//
37// 注意:
38//   (*) 如果未指定金鑰,則程式集不會被簽名。
39//   (*) KeyName 是指已經安裝在計算機上的
40//      加密服務提供程式(CSP)中的金鑰。KeyFile 是指包含
41//       金鑰的檔案。
42//   (*) 如果 KeyFile 和 KeyName 值都已指定,則 
43//       發生下列處理:
44//       (1) 如果在 CSP 中可以找到 KeyName,則使用該金鑰。
45//       (2) 如果 KeyName 不存在而 KeyFile 存在,則 
46//           KeyFile 中的金鑰安裝到 CSP 中並且使用該金鑰。
47//   (*) 要建立 KeyFile,可以使用 sn.exe(強名稱)實用工具。
48//       在指定 KeyFile 時,KeyFile 的位置應該相對於
49//       專案輸出目錄,即
50//       %Project Directory%\obj\<configuration>。例如,如果 KeyFile 位於
51//       該專案目錄,應將 AssemblyKeyFile 
52//       屬性指定為 [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
53//   (*) “延遲簽名”是一個高階選項 - 有關它的更多資訊,請參閱 Microsoft .NET Framework
54//       文件。
55//
56[assembly: AssemblyDelaySign(false)]
57[assembly: AssemblyKeyFile("")]
58[assembly: AssemblyKeyName("")]
59

汗,,[assembly: AssemblyTitle("")],,,,竟然程式集名是空的....不過你從該專案的資料夾裡確實能翻出與專案名相同的.dll檔案.估計如果你不在這條語句裡賦值,IDE預設生成的程式集與專案名相同.大膽用吧.(可是,我不知道怎麼用程式集?敬請期待下一篇:C#反射Reflection學習隨筆_AX)

⑤自知,我的解決方案(包含0~n個專案)用到了什麼程式集?                 //遍歷訪問當前應用程式域的程式集Assemble
                foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
                 {
                    //反射當前程式集的資訊
                    Response.Write("Assembly:"+assem.FullName+"<br>");
                }


⑥我們苦苦尋覓的Assembly裡面到底是什麼東西?有什麼值得我們去苦苦探究的?
其實在上面的AssemblyInfo.cs程式碼中,我們已經看出來一些東西,它裡面包含該Assembly的名稱/產品/描述/拷貝權..(鬼才關心)和版本號(這個很重要,但我覺得還是沒什麼太大的用處,是dll Hell 的剋星,順帶說一句,同一Assembly名稱的不同版本號的Assembly可同時執行),還有一個金鑰的概念,共享程式集和部署用的,看了半天沒看明白,就不誤人子弟了.  
那Assembly的主要用處是:
ⅰ與反射Reflection結合起來用,動態建立你所需要的類!!
ⅱ與反射Reflection結合起來用,獲得Assemble裡類的資訊
(據可靠的小道訊息說Assembly裡存的是一張包含元資料類名什麼的表) 
ⅲ使用別人已封裝好的類.

from: https://www.cnblogs.com/AXzhz/archive/2006/10/30/544601.html