InfoPath 2003 兼容物件模型
Microsoft InfoPath 是以元件物件模型撰寫 (COM) 應用程式,並公開其外部自動化的可程式性介面和窗體範本腳本作為 COM 介面。 為了支援建立使用 Visual C# 和 Visual Basic Managed 程式代碼語言的 InfoPath 解決方案,InfoPath 安裝程式會安裝三個 Interop 元件。 Interop 元件是 .NET 元件,可作為Managed和 Unmanaged 程式代碼之間的橋樑,將 COM 物件成員對應至對等的 .NET Managed 成員。
由 InfoPath 安裝之三個 Interop 組件的檔案名稱為:
- Microsoft.Office.Interop.InfoPath.dll
- Microsoft.Office.Interop.InfoPath.SemiTrust.dll
- Microsoft.Office.Interop.InfoPath.Xml.dll
本主題討論透過 Microsoft.Office.Interop.InfoPath.SemiTrust Interop 組件公開的物件模型,此組件專門用在 InfoPath 表單範本 (.xsn) 中撰寫及執行 Managed 程式碼商務邏輯。
如需 Microsoft.Office.Interop.InfoPath 和 Microsoft.Office.Interop.InfoPath.Xml 元件的相關信息,請參閱 Microsoft.Office.Interop.InfoPath 和 Microsoft.Office.Interop.InfoPath.Xml 命名空間的檔。
重要安裝資訊
根據預設,InfoPath 安裝程式的 [一般] 安裝選項會在 C:\Program Files\Microsoft Office\Office14 資料夾內安裝 Microsoft.Office.Interop.InfoPath.SemiTrust 與 Microsoft.Office.Interop.InfoPath.Xml 組件的複本。 Microsoft.Office.Interop.InfoPath 與 Microsoft.Office.Interop.InfoPath.Xml 組件也會安裝在「全域組件快取」(GAC) 中,您可從 C:\Windows\Assembly 資料夾檢視其內容。
如果尚未安裝這些組件,您應該確認已正確安裝 Microsoft InfoPath。 只要在執行安裝程式之前先安裝 .NET Framework 2.0 或更新版本,則 InfoPath 安裝程式中的 [.NET 程式設計支援] 選項就會在 [一般] InfoPath 安裝中設為 [從我的電腦執行]。 如果電腦上沒有這些 Interop 組件,則必須確認已安裝 .NET Framework 2.0 或更新版本,然後從 [控制台] 執行 [新增或移除程式],接著將 [.NET 程式設計支援] 選項設為 [從我的電腦執行]。
如需下載 .NET Framework 2.0 可轉散發套件的相關信息,請參閱 .NET Framework 2.0 可轉散發套件。
Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間
在發行 Microsoft Office InfoPath 2003 Service Pack 1 與 Microsoft Office InfoPath 2003 Toolkit for Visual Studio® .NET 之前,InfoPath 表單範本的所有程式設計邏輯都是使用 Microsoft JScript 或 Microsoft VBScript 所建立 (這兩者是在 Microsoft Script Editor (MSE) 開發環境中所撰寫)。 在 MSE 中撰寫的指令碼會在執行階段解譯,並存取 IPEDITOR.dll 動態連結程式庫所公開的 COM 物件模型。
為了支援建立以 Managed 程式碼語言 (如提供程式設計邏輯的 Visual C# 與 Visual Basic) 撰寫的表單範本,在 InfoPath 中加入了可主控 Common Language Runtime (CLR) 的功能,並且建立了 Microsoft.Office.Interop.InfoPath.SemiTrust Interop 組件,好讓 Managed 程式碼能夠以安全的方式來與 InfoPath 公開的 COM 物件模型交互操作。 如需適用於 InfoPath Managed 程式代碼表單範本的安全性模型相關信息,請參閱 關於具有程式碼之表單範本的安全性模型。
雖然在 InfoPath 表單範本中為特定工作撰寫 Managed 程式碼的程序,與撰寫指令碼來執行相同程式設計工作非常類似,但是從 Visual Studio 2012 的 [物件瀏覽器] 來檢視 Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間時,所公開的 InfoPath 2003 相容物件模型看起來會更複雜。 這是因為用來支援 InfoPath 2003 相容物件模型的 .NET Framework 互通性技術會要求 COM 伺服器公開它的所有公用介面,以及 .NET Framework 本身所需的一些其他結構。
COM 物件如何公開至 InfoPath 2003 相容物件模型
在 JScript、VBScript 或 Visual Basic (但不是 .NET 版本的 Visual Basic 和 Visual C#) 等高階語言中使用原始的 COM 伺服器時,公開的物件模型會比基礎的 COM 類別和介面更為簡單。 例如,當使用這些語言時,InfoPath UI 物件會公開七個方法,像是用來向使用者顯示訊息方塊的 Alert 方法。
然而,支援 UI 物件的基礎 COM 結構實際上是由三個項目所組成:兩個名為 UI 與 UI2 的介面,以及 COM coclass (實作這兩個介面的成員)。 一共有兩個版本的 UI 介面,因為 COM 架構需要保留固定的介面定義,以維護呼叫該介面實作的程式與元件的舊版相容性。
在此例中,UI 介面是為第一版的 InfoPath 所定義,共提供四個方法,其中包括 Alert 方法。
UI2 介面可視為第二版的 UI 介面,它是為 InfoPath Service Pack 1 所定義。
UI2 介面繼承原始 UI 介面的四個方法,並新增三個新方法,例如 Confirm 方法。 雖然您可以在使用 呼叫 Confirm 方法XDocument.UI.Confirm
的腳本或 Managed 程式代碼中撰寫一行程式代碼,但基礎程式代碼實際上是從 COM coclass 中該方法的實作呼叫 UI2 介面的 Confirm 方法。
對指令碼公開物件模型時會隱藏這些詳細資料,但是與 Managed 程式碼中的 COM 伺服器搭配使用所需的 interop 組件,會公開 coclass 與兩個介面。 至於在 MSE 指令碼開發環境中使用單一的 UI 物件時, Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間會公開下列三個項目:
雖然這三個介面都會在 [物件瀏覽器] 中公開,並且會包含在此命名空間的「類別庫」文件中,但是您只會用到 UIObject coclass 介面,此介面會實作 UI 物件,還搭配 UI2 介面的成員,這個介面是 UIObject coclass 介面所實作的最新版本介面。 若要從其父物件 XDocument 存取 UIObject coclass 介面,就像在指令碼中一樣,您可以使用 UI 存取子屬性。 除了一些值得注意的例外狀況之外,這是 InfoPath 原始版本中所有物件的型態,這些在發行 InfoPath Service Pack 1 時已獲得更新。
雖然此型態基本上是相同的,但是 InfoPath Service Pack 1 中所加入的全新物件會更為簡單,例如 Certificate 物件。 在此情況下,只需要注意兩個項目: CertificateObject coclass 介面以及 Certificate 介面的成員,此介面是由 CertificateObject coclass 介面所實作之最近且唯一的介面。 就像使用指令碼中的 InfoPath COM 物件一樣, Certificate 存取子屬性是用來存取其父代中的物件。
除了在集合的名稱後面附加 "Collection" (非 "Object" ) 的 coclass 介面之外,這個相同的模型會套用至集合的介面。 例如,COM DataAdapters 集合的 coclass 介面是名為 DataAdaptersCollection ,而它實作的介面則是 DataAdapters 介面。 相同的, XDocument 父代物件的 DataAdapters 存取子屬性是用來存取該集合。
此命名模式有三個例外狀況。 COM 應用程式和 XDocument 物件的 Coclass 介面沒有附加至其名稱的 “Object”。 其名稱與其對應的 COM 物件相同: Application 和 XDocument。 此外, Application 和XDocument Coclass 介面所實作的介面名稱前面會加上底線字元 (_) : _Application2 和 _XDocument2。 第三個例外狀況是 COM DataObject 物件。 這個物件的 coclass 介面名為 DataSourceObject ,但就像其他 InfoPath COM 物件一樣,它所實作的介面是 DataObject 介面。
Microsoft Office 物件 Microsoft XML Core Services (MSXML) 5.0 如何公開至 InfoPath 2003 相容物件模型
由 Microsoft XML Core Services (MSXML) 提供的物件模型之物件與成員子集合,也是一個 COM 伺服器,都是由 Microsoft.Office.Interop.InfoPath.SemiTrust interop 組件公開的介面所包裝。 會需要此子集合是因為某些 InfoPath COM 物件模型的成員仰賴 MSXML,而且必須以安全的方式存取這些成員。 在 Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間 (用來包裝 MSXML 物件模型的物件與成員) 中的介面名稱,與 MSXML COM 伺服器公開的名稱相同。 在大部分情況下,這些名稱的前面會加上 "IXMLDOM",因為它們是用來搭配 XML 文件物件模型 (DOM)。 例如, XDocument 介面的 DOM 屬性 (這是介面用來傳回表單基礎 XML 文件的參考),會傳回 Microsoft.Office.Interop.InfoPath.SemiTrust Interop 組件所包裝的 IXMLDOMDocument 介面。 呼叫和使用 IXMLDOMDocument 介面的成員,基本上與在不使用 Managed 程式碼的表單範本中使用指令碼方式相同。
如需在 Managed 程式碼表單範本中使用 Microsoft XML Core Services (MSXML) for Microsoft Office 物件模型成員的詳細資訊,請參閱使用 InfoPath 2003 物件模型處理 MSXML 和 System.Xml。
使用 IntelliSense
對於您在 Managed 程式代碼表單範本中針對 InfoPath 2003 相容物件模型撰寫的大部分程式代碼,您將使用thisXDocument
在預設FormCode.cs或FormCode.vb類別檔案的 方法中_Startup
初始化的 和 thisApplication
變數。 您可以使用 thisXDocument
和 thisApplication
變數來存取 XDocument和 Application Coclass 介面的成員。 當您輸入其中一個變數名稱,且後面跟著句點之後,IntelliSense 陳述式完成將會顯示對應 coclass 介面的清單成員。 您可以使用此方法繼續存取您想要使用的物件模型成員。
以下顯示使用 變數存取 Alert 方法的簡單範例thisXDocument
,以使用從變數存取的 Version 屬性來顯示 InfoPath 應用程式的thisApplication
版本。
thisXDocument.UI.Alert(thisApplication.Version);
thisXDocument.UI.Alert(thisApplication.Version)
使用類別庫參考檔
Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間類別庫參考文件的組織會反映 Coclass 介面與它們所實作的繼承介面之間的關聯性。 This is described in the "How COM Objects are Exposed to Managed Code" section earlier in this topic.
雖然 Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間參照文件的組織方式與命名一開始似乎讓人覺得困惑,然而這些主題的組織方式基本上與「InfoPath 物件模型參照」(屬於「InfoPath 開發人員參考資料」的一部分,隨附在 InfoPath 中) 的組織方式相同。 由於 Application 與 XDocument 介面主題的例外狀況,所有的 COM coclass 介面主題都會對應至 InfoPath 指令碼參照中對等的「物件」與「集合」主題。 例如, Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間參照文件中的「UIObject 介面」與「WindowsCollection 介面」主題,會對應至「InfoPath 物件模型參照」指令碼參照中「UI 物件」與「Windows 集合」主題內類似的內容。
然而,在主題開始的介面描述之後,至 coclass 介面成員的連結,會顯示空的主題。 若要顯示 coclass 介面實作的成員清單,必須開啟 coclass 繼承的最近介面主題,然後開啟其成員的表格。 在 coclass 介面主題中的「註解」小節開頭提供了繼承介面的連結。
當您在程式代碼 編輯器 中按 F1 時,行為很類似,不同之處在於您叫用 F1 說明的成員會直接顯示,因為您最常使用介面的成員。 不過,當您第一次遇到成員時,可以從已建立版本的介面實作成員,可能會造成混淆。 例如,如果您輸入 thisXDocument.UI.Alert
游標並放置游標, Alert
然後按 F1,則為標題為 “UI2” 的主題。[警示方法] 隨即顯示。 這是因為 Alert 方法是 UI2 介面成員的實作。
將選擇性參數傳遞給 InfoPath 物件模型成員
如果 InfoPath 2003 相容物件模型成員包含選擇性參數,而且您未指定該參數的值,則必須改為傳遞該參數的 Type.Missing 字段。 如果省略實際值,卻無法傳遞 Type.Missing 欄位,將會導致建置錯誤。 這適用於以 Visual C# 和 Visual Basic 撰寫的程式代碼。 例如,ViewObject 介面的 SelectNodes 方法包含兩個選擇性參數:varEndNode 和 varViewContext。 未指定這些選擇性參數之實際值的程式代碼行應該如下列範例所示。
IXMLDOMNode group1 =
thisXDocument.DOM.selectSingleNode("/my:myFields/my:group1");
thisXDocument.View.SelectNodes(group1, Type.Missing, Type.Missing);
Dim group1 As IXMLDOMNode = _
thisXDocument.DOM.selectSingleNode("/my:myFields/my:group1")
thisXDocument.View.SelectNodes(group1, Type.Missing, Type.Missing)
關於通用語言規格合規性
Microsoft.Office.Interop.InfoPath.SemiTrust 組件內部的每個介面與成員,都將 CLSCompliant 屬性設為 false。 由於參考文件有一部分是使用 System.Reflection 所產生,因此每個介面與成員描述的後面都有附加上「這個介面/方法/屬性和 CLS 不相容」。 不過,大部分的 Microsoft.Office.Interop.InfoPath.SemiTrust 命名空間之介面與成員實際上都是和 CLS 相容。