2011年7月24日 星期日

建立和使用 C# DLL

HOW TO:建立和使用 C# DLL (C# 程式設計手冊)

Visual Studio 2008

更新:2007 年 11 月
一個動態連結程式庫 (DLL) 會在執行階段連結到您的應用程式。若要示範 DLL 的建立和使用方式,請參考下面案例:
  • MathLibrary.DLL:程式庫檔案,包含可在執行階段呼叫的方法。在此範例中,DLL 包含 Add 和 Multiply 這兩個方法。
  • Add.cs:包含 Add(long i, long j) 方法的原始程式檔。它會傳回其參數的總和。包含 Add 方法的 AddClass 類別是UtilityMethods 命名空間的成員。
  • Mult.cs:原始程式碼,其包含了 Multiply(long x, long y) 方法。它會傳回其參數的乘積。包含 Multiply 方法的MultiplyClass 類別是 UtilityMethods 命名空間的成員。
  • TestCode.cs:包含 Main 方法的檔案。它使用 DLL 中的方法來計算執行階段引數的總和與乘積。
// File: Add.cs 
namespace UtilityMethods
{
    public class AddClass 
    {
        public static long Add(long i, long j) 
        { 
            return (i + j);
        }
    }
}


// File: Mult.cs
namespace UtilityMethods 
{
    public class MultiplyClass
    {
        public static long Multiply(long x, long y) 
        {
            return (x * y); 
        }
    }
}


// File: TestCode.cs

using UtilityMethods;

class TestCode
{
    static void Main(string[] args) 
    {
        System.Console.WriteLine("Calling methods from MathLibrary.DLL:");

        if (args.Length != 2)
        {
            System.Console.WriteLine("Usage: TestCode  ");
            return;
        }

        long num1 = long.Parse(args[0]);
        long num2 = long.Parse(args[1]);

        long sum = AddClass.Add(num1, num2);
        long product = MultiplyClass.Multiply(num1, num2);

        System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
        System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product);
    }
}
/* Output (assuming 1234 and 5678 are entered as command line args):
    Calling methods from MathLibrary.DLL:
    1234 + 5678 = 6912
    1234 * 5678 = 7006652        
*/


這個檔案包含了使用 Add 和 Multiply 等 DLL 方法的演算法。首先,它會剖析從命令列輸入的引數 num1 和 num2,然後再使用 AddClass 類別中的 Add 方法計算總和,並使用 MultiplyClass 類別上的 Multiply 方法計算乘積。
請注意,檔案開頭的 using 指示詞可以讓您使用名稱不符的類別名稱,在編譯時期參考 DLL 方法,如下所示:
MultiplyClass.Multiply(num1, num2);


否則,您必須使用完整名稱,如下所示:
UtilityMethods.MultiplyClass.Multiply(num1, num2);


執行

若要執行此程式,請輸入 EXE 檔的名稱,接著輸入兩個數目,如下所示:
TestCode 1234 5678
若要建立 MathLibrary.DLL 檔案,請使用下列命令列編譯 Add.cs 和 Mult.cs 兩個檔案:
csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs
此處的 /target:library 編譯器選項會通知編譯器輸出一個 DLL,而不要輸出一個 EXE 檔案。後面接續著一個檔案名稱的/out 編譯器選項則是用來指定該 DLL 的檔案名稱。否則編譯器會使用第一個檔案 (Add.cs) 當成 DLL 的名稱。
若要建立可執行檔 TestCode.exe,請使用下列命令列:
csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs
此處的 /out 編譯器選項會通知編譯器輸出一個 EXE 檔案,並指定輸出檔案的名稱 (TestCode.exe)。這個編譯器選項是選擇性的。此處的 /reference 編譯器選項會指定此程式所使用的 DLL 檔案。

Object 類別 (方法)

Object 類別

 Object 方法

 Equals 方法

 Finalize 方法

 GetHashCode 方法

 GetType 方法

 MemberwiseClone 方法

 ReferenceEquals 方法

 ToString 方法

Object 方法

.NET Framework 3.5

更新:2007 年 11 月
Object 型別會公開下列成員。
 名稱說明
ek57cbk7.pubmethod(zh-tw,VS.90).gif ek57cbk7.static(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifEquals多載。 判斷兩個 Object 執行個體是否相等。
ek57cbk7.protmethod(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifFinalize在記憶體回收 (GC) 回收 Object 前,允許 Object 嘗試釋放資源並執行其他清除作業。
ek57cbk7.pubmethod(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifGetHashCode做為特定型別的雜湊函式。
ek57cbk7.pubmethod(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifGetType取得目前執行個體的 Type
ek57cbk7.protmethod(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifMemberwiseClone建立目前 Object 的淺層複本 (Shallow Copy)。
ek57cbk7.pubmethod(zh-tw,VS.90).gif ek57cbk7.static(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifReferenceEquals判斷指定的 Object 執行個體是否為相同的執行個體。
ek57cbk7.pubmethod(zh-tw,VS.90).gif ek57cbk7.CFW(zh-tw,VS.90).gif ek57cbk7.xna(zh-tw,VS.90).gifToString傳回 String,表示目前的 Object


Button 類別 介紹

System.Web.UI.WebControls
 Text="Sort Ascending" (按鈕文字)
 CommandName="Sort" (自訂觸發名稱)
 CommandArgument="Ascending" (值)
 OnCommand="CommandBtn_Click"  (自訂按鈕Click事件 或 直接內建Click)
 (自訂Click方法)(void CommandBtn_Click(Object sender, CommandEventArgs e) {})
runat="server"/>



  說明:按一下 Button 控制項時,是否執行驗證
  說明:取得或設定選擇性 (Optional) 參數
  說明:取得或設定與 Button 控制項關聯的命令名稱,這個命令名稱將傳遞至 Command 事件
  說明:取得或設定當 Button 控制項的 Click 事件引發時執行的用戶端指令碼
  說明:取得或設定當按下 Button 控制項時,從目前的網頁要張貼到之目的地網頁的 URL(網址導向)
  說明:取得或設定顯示於 Button 控制項中的文字標題
  說明:預設 [ true ], 如果您指定 false,ASP.NET 網頁架構會將用戶端指令
     碼加入至網頁,以將表單張貼到伺服器上。
  說明:Button 所控制的控制項群組,會在回傳至伺服器時,針對這個群組引發驗證,預設為空字串 ("")。
  

System.Web.UI.WebControls 繼承說明

繼承階層架構

System.Web.UI.WebControls.WebControl
 System.Web.UI.WebControls.TableRow <--最大
System.Web.UI.WebControls.DataGridItem
System.Web.UI.WebControls.DetailsViewRow
System.Web.UI.WebControls.FormViewRow
System.Web.UI.WebControls.GridViewRow
System.Web.UI.WebControls.TableFooterRow
System.Web.UI.WebControls.TableHeaderRow

【TableRow 類別】
System.Web.UI.WebControls
TableRow 成員
TableRow 建構函式
TableRow 方法
TableRow 屬性
TableRow 事件
類別:TableRow 類別表示 【ASP.20 Table 控制項】中的資料列。
說明:您可以使用 Cells 集合,以程式設計的方式管理資料列中的儲存格。Cells 集合為表示資料列中儲存格的 TableCell 物件集合。

【GridView 類別】
System.Web.UI.WebControls
類別:在資料表中顯示資料來源的值,其中每個資料行表示一個欄位,每個資料列表示一個資料錄。
GridView 成員
GridView 建構函式
GridView 方法
GridView 屬性
.Rows:取得 GridViewRow 物件的集合,其表示 GridView 控制項中的資料列。
(說明)GridView 控制項將所有資料列儲存在 Rows 集合中。
GridView 事件


【GridViewRow 類別】
System.Web.UI.WebControls
類別:GridView 控制項中的個別資料列。
說明:GridViewRow 類別用來表示 GridView 控制項中的個別資料列。GridView 控制項中的每個資料列都有指定的資料列型別。下表列出各種資料列型別。
GridViewRow 成員
GridViewRow 建構函式
GridViewRow 方法
GridViewRow 屬性
.Cells:取得 TableCell 物件的集合,表示 Table 控制項中資料列的儲存格。 (繼承自 TableRow)。
(說明):只有在以程式設計方式建置 Table 控制項時,才會使用這個屬性。在設計階段,這個屬性經由宣告 TableCell 物件來設定。
GridViewRow 事件

【TableCell 類別】
System.Web.UI.WebControls
類別:【Table 控制項】中的儲存格。
說明:TableCell 類別表示 Table 控制項中的儲存格。您可以使用 Text 屬性,指定或確定儲存格的內容。
TableCell 成員
TableCell 建構函式
TableCell 方法
TableCell 屬性
TableCell 事件

GridView 控制項 BottonField 類型 介紹

BottonField 類型 介紹
GridView控制項底 下ButtonField 顯示Button類型(編輯、刪除、修改、確認)

如果按下Button按鈕會引發 RowCommand  事件處理
在事件中,可以加入自訂程式碼,

ButtonField 類別重要的屬性
ButtonType 按鈕顯示型態:一般Button、Image、Link 三種方式呈現
DataTextField:連結 資料欄位 名稱:(如:ProductID、ProductName...等)
DataTextFormatString:資料來源欄位 格式化 跟 BoundFiled類型一樣
ImageUrl:當按鈕型式為Image時,指定Image所在連結位置
CasusValidation :按下按鈕時是否 引發 控制項驗證
CommandName:按下Button按鈕時 自訂觸發名稱(比如取名:order、Cancel)
ValidationGroup: 按下Button按鈕時 所要引發的Validation Group名稱


CommandName屬性 \
RowCommand 事件介紹
e.CommandArgument方法 :取得值>>>:當按下:會自動判讀 按下的按鈕是位於第幾個,然後將 【值】傳回(String)
重點:傳回的值型態為:String格式 , 如果要把String轉成 Int格式的話,必需透過Covert.ToInt32( e.CommandArgument);

e.CommandName:取得命令的名稱 自訂名稱(比如取名:order、Cancel)
e.CommandSource:取得命令來源 (System.Web.UI.WebControls.GridView)
e.Equals:物件是否相等
e.GetHashCode:衍生類別可覆寫這個方法。值類別必須覆寫這個方法,以提供適合這個類別的雜湊函式,確保在雜湊表中有更佳的散發。可能做為雜湊表索引鍵的類別也必須覆寫這個方法,因為做為雜湊表索引鍵的物件需要透過這個方法產生它們自己的雜湊程式碼。
e.GetType:Type 執行個體,表示目前執行個體的確實執行階段型別
e.toString():System.Web.UI.WebControls.GridViewCommandEventArgs

GridView 控制項 BoundField類型介紹

說明: BoundFiled 連結資料欄位名稱,將以 【文字方式】顯示.
紅色方框圖片(如下)
圖示(一)












BoundField 比較重要屬性介紹
DataField:對應Data Source資料欄位 (如圖示一 紅框內:ProductID ..另外三個欄位名稱)
DataFormatString:串字格式化,如顯示成貨幣、科學記號
SortExpression:設定欄位排序鍵值 (如示圖一:可以選擇 ProductID 及另外三個欄位名稱做排序方式)
ConvertEmptyStringToNull: 屬性設字為true 時:將 字串轉換為Null值,應用若Update的資料屬於空字串時,將它轉換為Null 值:
NullDisplayText:如果顯示欄位資料為Null值時,可以自訂的顯示文字 出現
ApplyFormatInEditMode:是否在編輯模式中顯示套用的DataFormatString格式資料(預設:False)如果要設定true資料必需先解除格式化,這樣資料才會更新
HtmlEncode:顯示給使用者的位是否採用HTML編碼(防止惡意的程式碼),但DataFormatString有用到的話,就無法設定true,資料就無法存檔
InsertVIsible:在Insert模式時,欄位是否看得見

PS.如果資料來源 文字需格式化(DataFormatString)的話,必須HtmlEncode屬性設定為false,若不改為false的話,則不會存標該欄位資料

GridView 控制項 七大類基本介紹

GridView 控制項 基本說明

主要處理:多筆資料使用

.內建分頁、排序、編輯、更新、刪除與"列"的選擇
.支援AJAX非同步的分頁與排序(由EnableSortingAndPaging-Callbacks屬性設定)
.客製化自訂GridView外觀樣式(透過Theme與Style)
.動態設定各種屬性及事件處理。
.豐富事件處理
.Row資料列支援由多個GridView欄位所組成的鍵值。
.Hyperlink欄位可以指定多個Fields欄位資料來源
.支援背景圖片顯示。
.GridView和DetailsView與FormView搭配,可以產生互補效果,。

PS.GridView不支援Insert資料,由DetailsView 控制項做 Insert動作

GridView控制項底下 Field 七大控制類別
一、CommandField (命令欄位【Select、Edit、Update、Delete)
二、HyperLinkField (超連結按鈕)
三、TemplateFiled (自訂樣板內容,由開發自行自由設定)
四、ButtonFiled (一般按鈕 、可擇持Button、Image、Link方式呈現, 按下時引發RowCommand事件)
五、BoundField (文字方式顯示)
六、ImageFiled (連結資料的顯示圖片欄位)
七、CheckboxField (CheckBox欄位 類型:通常使用布林值 true/false顯示)

以上七大Field類別 寫入 GridView 底下 Columns 標籤 裡面
PS.DetailsView 也擁有這 Field七大控制類別