共用方式為


在 .NET Framework 4 工作流程中使用 Interop 活動

本主題僅適用於 Windows Workflow Foundation 4。

使用 .NET Framework 3.0 或 .NET Framework 3.5 建立的活動,可以經由使用 Interop 活動,在 .NET Framework 4 工作流程中使用。 本主題提供使用 Interop 活動的概觀。

Ee264174.note(zh-tw,VS.100).gif Visual Basic 注意:
Interop 活動不會出現在工作流程設計工具的工具箱中,除非工作流程的專案已將其 [目標 Framework] 的設定值設為 [.Net Framework 4]。

在 .NET Framework 4 Workflows 中使用 Interop 活動

在本主題中,會建立一個 .NET Framework 3.5 活動程式庫,其中包含 DiscountCalculator 活動。 DiscountCalculator 會根據購買金額計算折扣,並且由包含 PolicyActivitySequenceActivity 組成。

Ee264174.note(zh-tw,VS.100).gif注意:
在本主題中建立的 .NET Framework 3.5 活動會使用 PolicyActivity 實作活動的邏輯。 不需使用自訂的 .NET Framework 3.5 活動或 Interop 活動,即可在 .NET Framework 4 工作流程中使用規則。 如需在 .NET Framework 4 工作流程中使用規則而不使用 Interop 活動的範例,請參閱 .NET Framework 4 中的原則活動 範例。

若要建立 .NET Framework 3.5 活動程式庫專案

  1. 開啟 Visual Studio 2010 並選取 [新增],然後選取 [檔案] 功能表中的 [專案]。

  2. 展開 [已安裝的範本] 窗格中的 [其他專案類型] 節點,並選取 [Visual Studio 方案]。

  3. 選取 [Visual Studio 方案] 清單中的 [空白方案]。 在 [名稱] 方塊中輸入 PolicyInteropDemo,然後按一下 [確定]。

  4. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropDemo],並選取 [加入] 和 [新增專案]。

    Ee264174.Tip(zh-tw,VS.100).gif提示:
    如果看不到 [方案總管] 視窗,請選取 [檢視] 功能表上的 [方案總管]。

  5. 依序選取 [已安裝的範本] 清單中的 [Visual C#] 和 [工作流程]。 選取 .NET Framework 版本下拉式清單中的 [.NET Framework 3.5],然後選取 [範本] 清單中的 [工作流程活動程式庫]。

  6. 在 [名稱] 方塊中輸入 PolicyActivityLibrary,然後按一下 [確定]。

  7. 以滑鼠右鍵按一下 [方案總管] 中的 [Activity1.cs],並選取 [刪除]。 按一下 [確定] 以繼續。

若要建立 DiscountCalculator 活動

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyActivityLibrary],然後依序選取 [加入] 和 [活動]。

  2. 選取 [Visual C# 項目] 清單中的 [活動 (程式碼分開置放)]。 在 [名稱] 方塊中輸入 DiscountCalculator,然後按一下 [確定]。

  3. 以滑鼠右鍵按一下 [方案總管] 中的 [DiscountCalculator.xoml],然後選取 [檢視程式碼]。

  4. 將下列三個屬性加入至 DiscountCalculator 類別。

    public partial class DiscountCalculator : SequenceActivity
    {
        public double Subtotal { get; set; }
        public double DiscountPercent { get; set; }
        public double Total { get; set; }
    }
    
  5. 以滑鼠右鍵按一下 [方案總管] 中的 [DiscountCalculator.xoml],然後選取 [檢視設計工具]。

  6. 從 [工具箱] 的 [Windows Workflow v3.0] 區段,將 [原則] 活動拖放至 [DiscountCalculator] 活動中。

    Ee264174.Tip(zh-tw,VS.100).gif提示:
    如果看不到 [工具箱],請從 [檢視] 功能表中選擇 [工具箱]。

若要設定規則

  1. 如果尚未選取新加入的 [原則] 活動,請在該活動上按一下加以選取。

  2. 按一下 [屬性] 視窗中的 [RuleSetReference] 屬性加以選取,然後按一下屬性右邊的省略符號按鈕。

    Ee264174.Tip(zh-tw,VS.100).gif提示:
    如果看不到 [屬性] 視窗,請選擇 [檢視] 功能表上的 [屬性視窗]。

  3. 選取 [新增]。

  4. 按一下 [加入規則]。

  5. 在 [條件] 方塊中輸入下列運算式。

    this.Subtotal >= 50 && this.Subtotal < 100
    
  6. 在 [Then 動作] 方塊中輸入下列運算式。

    this.DiscountPercent = 0.075
    
  7. 按一下 [加入規則]。

  8. 在 [條件] 方塊中輸入下列運算式。

    this.Subtotal >= 100
    
  9. 在 [Then 動作] 方塊中輸入下列運算式。

    this.DiscountPercent = 0.15
    
  10. 按一下 [加入規則]。

  11. 在 [條件] 方塊中輸入下列運算式。

    this.DiscountPercent > 0
    
  12. 在 [Then 動作] 方塊中輸入下列運算式。

    this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
    
  13. 在 [Else 動作] 方塊中輸入下列運算式。

    this.Total = this.Subtotal
    
  14. 按一下 [確定],關閉 [規則集編輯器] 對話方塊。

  15. 確定已在 [名稱] 清單中選取新建立的 RuleSet,然後按一下 [確定]。

  16. 按下 F6 以建置方案。

下列程式碼範例顯示在本程序中加入至 DiscountCalculator 活動的規則。

Rule1: IF this.Subtotal >= 50 && this.Subtotal < 100 
       THEN this.DiscountPercent = 0.075 

Rule2: IF this. Subtotal >= 100 
       THEN this.DiscountPercent = 0.15 

Rule3: IF this.DiscountPercent > 0 
       THEN this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent 
       ELSE this.Total = this.Subtotal

執行 PolicyActivity 時,這三個規則會評估並修改 DiscountCalculator 活動的 SubtotalDiscountPercentTotal 屬性值,以計算所需的折扣。

搭配使用 DiscountCalculator 活動與 Interop 活動

若要在 .NET Framework 4 工作流程內使用 DiscountCalculator 活動,需使用 Interop 活動。 本節中會建立兩個工作流程 (其中一個使用程式碼,另一個使用工作流程設計工具),示範如何搭配使用 Interop 活動與 DiscountCalculator 活動。 兩個工作流程會使用同樣的主應用程式。

若要建立主應用程式

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropDemo],並選取 [加入] 和 [新增專案]。

  2. 確定選取 .NET Framework 版本下拉式清單中的 [.NET Framework 4],然後選取 [Visual C# 項目] 清單中的 [工作流程主控台應用程式]。

  3. 在 [名稱] 方塊中輸入 PolicyInteropHost,然後按一下 [確定]。

  4. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],然後選取 [屬性]。

  5. 在 [目標 Framework] 下拉式清單中,將選取項目從 [.NET Framework 4 Client Profile] 變更為 [.NET Framework 4]。 按一下 [] 確認。

  6. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入參考]。

  7. 選取 [專案] 索引標籤中的 [PolicyActivityLibrary],然後按一下 [確定]。

  8. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入參考]。

  9. 選取 [.NET] 索引標籤中的 [System.Workflow.Activities]、[System.Workflow.ComponentModel] 和 [System.Workflow.Runtime],然後按一下 [確定]。

  10. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [設定為啟始專案]。

  11. 按下 F6 以建置方案。

在程式碼中使用 Interop 活動

在此範例中,會使用包含 Interop 活動和 DiscountCalculator 活動的程式碼建立工作流程定義。 使用 WorkflowInvoker 叫用這個工作流程,使用 WriteLine 活動則會將規則評估的結果寫入至主控台。

若要在程式碼中使用 Interop 活動

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [Program.cs],然後選取 [檢視程式碼]。

  2. 將下列 using 陳述式加入至檔案最上方。

    using PolicyActivityLibrary;
    
  3. 移除 Main 方法的內容,並以下列程式碼取代。

    static void Main(string[] args)
    {
        CalculateDiscountUsingCodeWorkflow();
    }
    
  4. 在名為 CalculateDiscountUsingCodeWorkflowProgram 類別中建立新方法,其中包含下列程式碼。

    static void CalculateDiscountUsingCodeWorkflow()
    {
        Variable<double> Subtotal = new Variable<double>
        {
            Default = 75.99,
            Name = "Subtotal"
        };
    
        Variable<double> DiscountPercent = new Variable<double>
        {
            Name = "DiscountPercent"
        };
    
        Variable<double> Total = new Variable<double>
        {
            Name = "Total"
        };
    
        Activity wf = new Sequence
        {
            Variables = { Subtotal, DiscountPercent, Total },
            Activities = 
            {
                new Interop
                {
                    ActivityType = typeof(DiscountCalculator),
                    ActivityProperties = 
                    {
                        { "Subtotal", new InArgument<double>(Subtotal) },
                        { "DiscountPercentOut", new OutArgument<double>(DiscountPercent) },
                        { "TotalOut", new OutArgument<double>(Total) }
                    }
                },
                new WriteLine
                {
                    Text =  new InArgument<string>(env => 
                        string.Format("Subtotal: {0:C}, Discount {1}%, Total {2:C}", 
                        Subtotal.Get(env), DiscountPercent.Get(env) * 100, Total.Get(env)))
                }
            }
        };
    
        WorkflowInvoker.Invoke(wf);
    }
    
    Ee264174.note(zh-tw,VS.100).gif注意:
    DiscountCalculator 活動的 SubtotalDiscountPercentTotal 屬性會以 Interop 活動的引數顯示,並且繫結於 Interop 活動之 ActivityProperties 集合中的區域工作流程變數。Subtotal 會加入做為 In 引數,因為 Subtotal 資料會流入 Interop 活動,而 DiscountPercentTotal 則會加入做為 Out 引數,因為其資料會流出 Interop 活動。 請注意,兩個 Out 引數是以 DiscountPercentOutTotalOut 這兩個名稱加入,表示它們代表 Out 引數。 DiscountCalculator 型別會指定為 Interop 活動的 ActivityType

  5. 按 CTRL+F5 建置並執行應用程式。 將 Subtotal 的值替換成不同的值,測試出 DiscountCalculator 活動所提供的不同折扣層級。

    Variable<double> Subtotal = new Variable<double>
    {
        Default = 75.99, // Change this value.
        Name = "Subtotal"
    };
    

在工作流程設計工具中使用 Interop 活動

在這個範例中,會使用工作流程設計工具建立工作流程。 這個工作流程與上一個範例中的工作流程具有相同的功能,但不會使用 WriteLine 活動顯示折扣,而是由主應用程式在工作流程完成時擷取並顯示折扣資訊。 同時,這個工作流程不使用區域工作流程變數來包含資料,而是在工作流程設計工具中建立引數,並在叫用工作流程時從主機傳入值。

若要使用工作流程設計工具建立的工作流程裝載 PolicyActivity

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [Workflow1.xaml],再選取 [刪除]。 按一下 [確定] 以繼續。

  2. 以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入]、[新增項目]。

  3. 展開 [Visual C# 項目] 節點,並選取 [工作流程]。 選取 [Visual C# 項目] 清單中的 [活動]。

  4. 在 [名稱] 方塊中,輸入 DiscountWorkflow,並按一下 [加入]。

  5. 按一下工作流程設計工具左下角的 [引數] 按鈕,顯示 [引數] 窗格。

  6. 按一下 [建立引數]。

  7. 在 [名稱] 方塊中輸入 Subtotal,選取 [方向] 下拉式清單中的 [In],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。

    Ee264174.note(zh-tw,VS.100).gif注意:
    如果 [Double] 未出現在 [引數型別] 下拉式清單中,請選取 [瀏覽型別]、在 [型別名稱] 方塊中輸入 System.Double,然後按一下 [確定]。

  8. 按一下 [建立引數]。

  9. 在 [名稱] 方塊中輸入 DiscountPercent,選取 [方向] 下拉式清單中的 [Out],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。

  10. 按一下 [建立引數]。

  11. 在 [名稱] 方塊中輸入 Total,選取 [方向] 下拉式清單中的 [Out],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。

  12. 按一下工作流程設計工具左下角的 [引數] 按鈕,關閉 [引數] 窗格。

  13. 從 [工具箱] 的 [控制流程] 區段,將 [序列] 活動拖放到工作流程設計工具介面上。

  14. 從 [工具箱] 的 [移轉] 區段,將 [Interop] 活動拖放到 [序列] 活動內。

  15. 按 [按一下即可瀏覽] 標籤上的 [Interop] 活動,在 [型別名稱] 方塊中輸入 DiscountCalculator,然後按一下 [確定]。

    Ee264174.note(zh-tw,VS.100).gif注意:
    Interop 活動加入至工作流程中,並將 DiscountCalculator 型別指定為其 ActivityType 時,Interop 活動會公開三個 In 引數和三個 Out 引數 (代表 DiscountCalculator 活動的三個公用屬性)。 In 引數的名稱與三個公用屬性的名稱相同,而三個 Out 引數的名稱則是屬性名稱附加 Out。 在下列步驟中,在前述步驟中建立的工作流程引數會繫結至 Interop 活動的引數。

  16. 在 [DiscountPercentOut] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 DiscountPercent,然後按下 TAB 鍵。

  17. 在 [Subtotal] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 Subtotal,然後按下 TAB 鍵。

  18. 在 [TotalOut] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 Total,然後按下 TAB 鍵。

  19. 以滑鼠右鍵按一下 [方案總管] 中的 [Program.cs],然後選取 [檢視程式碼]。

  20. 將下列 using 陳述式加入至檔案最上方。

    using System.Collections.Generic;
    
  21. 註解 Main 方法中對 CalculateDiscountInCode 方法的呼叫,然後加入下列程式碼。

    Ee264174.note(zh-tw,VS.100).gif注意:
    如果您未遵循前述程序,而出現預設的 Main 程式碼,請以下列程式碼取代 Main 的內容。

    static void Main(string[] args)
    {
        CalculateDiscountUsingDesignerWorkflow();
        //CalculateDiscountUsingCodeWorkflow();
    }
    
  22. 在名為 CalculateDiscountUsingDesignerWorkflowProgram 類別中建立新方法,其中包含下列程式碼。

    static void CalculateDiscountUsingDesignerWorkflow()
    {
        double SubtotalValue = 125.99;
        Dictionary<string, object> wfargs = new Dictionary<string, object>
        {
            {"Subtotal", SubtotalValue}
        };
    
        Activity wf = new DiscountWorkflow();
    
        IDictionary<string, object> outputs =
            WorkflowInvoker.Invoke(wf, wfargs);
    
        Console.WriteLine("Subtotal: {0:C}, Discount {1}%, Total {2:C}",
            SubtotalValue, (double)outputs["DiscountPercent"] * 100,
            outputs["Total"]);
    }
    
  23. 按 CTRL+F5 建置並執行應用程式。 若要指定不同的 Subtotal 金額,請變更下列程式碼中 SubtotalValue 的值。

    double SubtotalValue = 125.99; // Change this value.
    

規則功能概觀

WF 規則引擎可支援以優先順序為主的方式處理規則,並且支援向前鏈結。 規則可針對單一項目或集合中之項目進行評估。 如需規則概觀與特定規則功能的詳細資訊,請參閱下表。

規則功能 文件

規則概觀

Windows Workflow Foundation Rules Engine 簡介 (英文)

RuleSet

在工作流程中使用 RuleSetRuleSet

規則評估

RuleSet 中的規則評估

規則鏈結

向前鏈結控制項規則的向前鏈結

處理規則中的集合

處理規則中的集合

使用 PolicyActivity

使用 PolicyActivity 活動PolicyActivity

在 .NET Framework 4 中建立的工作流程不會使用 WF 提供的所有規則功能,例如宣告式活動條件及條件式活動 (例如 ConditionedActivityGroupReplicatorActivity)。 如有必要,這個功能可供以 .NET Framework 3.0 和 .NET Framework 3.5 建立的工作流程使用。 如需詳細資訊,請參閱移轉工作流程.