[Office開發系列] C# 4.0 在 Office (含 2003-2010) 開發上的支援

[Office開發系列] C# 4.0 在 Office (含 2003-2010) 開發上的支援

Visual Studio 2010 在 4/12 正式發表 RTM 版本,.NET Framework 4.0 也正式向大家見面,其中的 C# 4.0 包含了很多新的程式設計能力,特別是針對 Office 軟體的開發部份,C# 3.0 以前的版本在開發 Office 應用程式時遠比 VB/VBA 不方便,除了語言特性 (C# 是一種強型別的語言) 外,Office 本身的物件模型是使用 COM 介面顯露出來的,COM 介面碰到 C# 的結果就是不夠友善的程式設計風格,像是 Excel 的 Workbook.SaveAs() 方法,這個方法具有 12 個參數,如果用 Visual Basic 來開發的話,可以用它的具名參數或是只傳入必要參數的值即可,但是 C# 基於語言的特性,必須要傳入 12 個參數,而要採用預設值的參數必須要傳入 Type.Missing 作為忽略的旗標之用,這對於 C# 開發人員來說是十分不便的一件事。

微軟在 C# 4.0 中總算回應了 C# 開發人員的期待,C# 4.0 終於正式支援了具名參數 (Named Argument) 以及選擇性參數 (Optional Parameters),讓 C# 開發人員終於可以和 Visual Basic 開發人員一樣輕鬆的寫碼了:

C# 3.0:
this.CheckSpelling(
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

C# 4.0:
this.CheckSpelling();

 

另外,以往 C# 開發 Office 應用程式的四種限制:選擇性參數,傳址 (Call by Reference),晚期繫結 (Late Binding) 以及具名參數等限制,在 C# 4.0 都一一的破除了。

1. 選擇性參數與具名參數:

由 C# 4.0 的選擇性參數與具名參數支援。

 2. 傳址:

C# 4.0 的編譯器已經配合 Office Primary Interop Assemblies,為大部份的傳址參數做了自動化,也就是說在大多數的案例中都不必再像 C# 3.0 時代般一定要用 ref 來傳遞參考的參數了 (會要求這樣傳的參數幾乎都是 Optional Parameters)。

3. 晚期繫結:

C# 4.0 新增了一個 dynamic 運算符,讓針對 COM 以及 Office 物件模型的繫結可以延後到存取時才執行,也就是執行期決議模式。dynamc 可以讓開發人員不必特別去記憶 Office PIAs 中複雜的物件模型,而且也可以讓存取 COM 元件時可以讓開發人員省下輸入 COM 型別變數的能力。例如下列的程式碼:

dynamic dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
dialog.Name = "Testing";
dialog.Show();
MessageBox.Show(dialog.Name);

另外,C# 4.0 也允許 C# 開發人員使用 RTTI (Reflection) 來動態存取 Office 物件模型方法的能力,例如下列程式碼:

Word.Dialog dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
System.Type dialogType = typeof(Word.Dialog);

// Set the Name property of the dialog box.
dialogType.InvokeMember("Name",
    System.Reflection.BindingFlags.SetProperty |
        System.Reflection.BindingFlags.Public |
        System.Reflection.BindingFlags.Instance,
    null, dialog, new object[] { "Testing" },
    System.Globalization.CultureInfo.InvariantCulture);

// Display the dialog box.
dialog.Show(ref missing);

// Show the Name property.
MessageBox.Show(dialogType.InvokeMember("Name",
    System.Reflection.BindingFlags.GetProperty |
        System.Reflection.BindingFlags.Public |
        System.Reflection.BindingFlags.Instance,
    null, dialog, null,
    System.Globalization.CultureInfo.InvariantCulture).ToString());

因為關鍵的四種 Office PIAs 的呼叫問題被破解後,未來 C# 在 Office 開發上的路會相當的寬廣,C# 開發人員也不必再為了要寫 Office 應用程式跑去學 VBA 或 VB.NET 了。

PS: 目前唯一的 Office PIAs 和 C# 的差異,就只有 PIAs 的陣列起始值仍為 1,因此不可以用 0 作為起始值。