星期三, 1月 23, 2008

抽象class與介面interface

Abstract class
可擺放實做的method,也可放抽象的method,目的在擴充,所以抽象類別是未定義完全的類別,需繼承才能使用,抽象的method可實做(擴充),可不實做(擴充)

Interface
只定義不實做method,目的讓父類別可以呼叫子類別method,因此當有多個子類別實作父類別的method,即可只透過父類別(介面)的參考呼叫各子類別的method
*interface預設public及abstract,因此有加沒加沒差

星期二, 1月 22, 2008

MySQL亂碼

在網路上找半天
原因是MySQL預設文字編碼是 cp1252 West European (latin1)
因此儲進去的格式已變成latin1了 所以用其他編碼讀取來當然會錯

最簡單的解法方法
1.網頁上 (如phpMyAdmin)
=>讓資料庫的儲存格與讀取的編碼相同
1.將文字編碼cp1252 West European (latin1) 改為utf8
2.sql connection string =>Host=localhost;Database=xxx;charset=utf8
加上編碼utf8即可正常顯示

至於原本已經存latin1的...
還沒找到解決方法


另外利用連線取資料
如果資料庫設為utf,則建利連線後
可下 mysql_query("SET CHARACTER SET 'utf8'");

星期五, 1月 18, 2008

C#動態創建類的實例

C#動態創建類的實例: "

C#動態創建類的實例,如果對性能要求不是很高,而且需要動態創建類的實例的時候可以考慮使用以下的方法:

1. 定義兩個類:
// 基類
public class BaseBusiness
{ }

// 子類
public class SampleBusiness : BaseBusiness
{ }

2. 動態創建類的實例

// 程序集名稱
string assemblyName = "abc.Business";
// 類名稱
string className = "SampleBusiness";

// 獲得指定名稱的類型:程序集名稱 + 類名稱
Type type = Type.GetType(assemblyName + "." + className);

// 創建類型的一個實例
object obj = Activator.CreateInstance(type);

// 將實例強制轉換成指定的類型
BaseBusiness curBusiness = (BaseBusiness)obj;

(編輯:IT資訊之家 www.it55.com )


**如何invoke method
續上例
invoke method有兩種,
1.實體化(new一個實體再invoke)

法1. 透過實體直接使用
curBusiness.Invoke(obj,new string[]{"test"}); //test => 字串參數,如果沒有就放null

法2. 透過type取得method
System.Reflection.MethodInfo method = type.GetMethod("go"); //go => method name


2.靜態呼叫(如Math.abs的static物件,不用new)
method = type.GetMethod("MethodtoUpperCase");//有個static的method名稱
string a = (string)method.Invoke(null,new [] object{"lowercase"}); //要傳object陣列型態
p.s 沒有參數,就給null,如同沒有實體的null
==>LOWERCASE


Reference:C#反射實例講解

星期一, 1月 14, 2008

強名稱

看半天看不懂什麼叫強名稱
似乎是為了讓 dll名稱唯一
從MSDN上抄來的

具有強名稱的程序集
強名稱是由程序集的標識加上公鑰和數字簽名組成的。其中,程序集的標識包括簡單文本名稱、版本號和區域性信息(如果提供的話)。強名稱是使用相應的私鑰,通過程序集文件(包含程序集清單的文件,並因而也包含構成該程序集的所有文件的名稱和散列)生成的。

通過簽發具有強名稱的程序集,您可以確保名稱的全局唯一性。強名稱還特別滿足以下要求:

*強名稱依賴於唯一的密鑰對來確保名稱的唯一性。任何人都不會生成與您生成的相同的程序集名稱,因為用一個私鑰生成的程序集的名稱與用其他私鑰生成的程序集的名稱不相同。
*強名稱保護程序集的版本沿襲。強名稱可以確保沒有人能夠生成您的程序集的後續版本。用戶可以確信,他們所加載的程序集的版本出自創建該版本(應用程序是用該版本生成的)的同一個發行者。
*強名稱提供可靠的完整性檢查。通過 .NET Framework 安全檢查後,即可確信程序集的內容在生成後未被更改過。但請注意,強名稱中或強名稱本身並不暗含信任級別,例如由數字簽名和支持證書提供的信任。

在引用具有強名稱的程序集時,您應該能夠從中受益,例如版本控制和命名保護。如果此具有強名稱的程序集以後引用了具有簡單名稱的程序集(後者沒有這些好處),則您將失去使用具有強名稱的程序集所帶來的好處,並依舊會產生 DLL 衝突。因此,具有強名稱的程序集只能引用其他具有強名稱的程序集。

星期三, 1月 09, 2008

Log4net

日誌記錄,可分Debug、Info、Warn、Error、Fatal等級
相關文件:
1.史帝芬心得筆記--log4net
2.Log4Net使用指南

Installation
Step1. 下載log4net
http://logging.apache.org/log4net/

Step2. 設定log4net.snk
似乎是存讓dll存取本機檔案的key,所以不同的電腦都需重新執行下列指令
*注意,log4net.snk是經由下列程式產生,並不會存在任何pack裡
command:sn -k log4net.snk
p.s. sn一般存放在C:\Program Files\Microsoft.NET\FrameworkSDK(xxx版本)\Bin\
執行完後便會產生log4net.snk
再移到解壓的根目錄(log4net預設位置讀取log4net.snk的位置)

Step3.編譯log4net.dll
在解壓的src目錄下將log4net.sln載入Visual Studio .NET,編譯後可以得到log4net.dll

p.s. 未產生log4net.snk會出現以上錯誤訊息「...讀取金鑰檔'log4net.snk' 發生錯誤 -- 系統找不到指定的檔案。」


===重建金鑰,不必重新compiler==
下面是網路上找到的

1. 創建一個新的隨機密鑰對。
d:\temp> sn -k test.snk

2. 反編譯目標程序集(假設是 a.dll)。
d:\temp> ildasm a.dll /out=a.il

3. 重新編譯,附帶強命名參數。
d:\temp> ilasm a.il /dll /resource=a.res /key=test.snk /optimize

4. 驗證簽名信息。
d:\temp> sn -v a.dll


*找不到ilasm.exe
用搜尋找一下吧...找到後,在同一資料夾還有fusion.dll


MSIL 組譯工具 (Ilasm.exe)
MSIL 反組譯工具 (Ildasm.exe)

星期二, 1月 08, 2008

xmlDoc.load跟xmlDoc.loadXml的不同

xmlDoc.load:可讀取xml檔案(dtd未定義)
xmlDoc.loadXml:直接讀取已定義的xml檔...

如過用loadXml讀未定義的xml檔
會出現「在根層次的資料無效。 第 1 行,位置 1。」
應該是這樣吧...智源大師開導後的心得

例外可用.net裡的XmlTextWriter建立語式正確的 XML

以 XmlTextWriter 建立語式正確的 XML