다음을 통해 공유


.NET Framework 4 워크플로에서 Interop 활동 사용

이 항목은 Windows Workflow Foundation 4에 적용됩니다.

.NET Framework 3.0 또는 .NET Framework 3.5를 사용하여 만든 활동은 Interop 활동을 통해 .NET Framework 4 워크플로에서 사용할 수 있습니다. 이 항목에서는 Interop 활동 사용에 대해 간략하게 설명합니다.

Ee264174.note(ko-kr,VS.100).gif Visual Basic 참고:
워크플로 프로젝트의 대상 프레임워크 설정을 .Net Framework 4로 설정하지 않으면 Interop 활동이 Workflow Designer 도구 상자에 나타나지 않습니다.

.NET Framework 4 워크플로에서 Interop 활동 사용

이 항목에서는 DiscountCalculator 활동을 포함하는 .NET Framework 3.5 활동 라이브러리를 만듭니다. DiscountCalculator는 구매량을 기준으로 할인을 계산하며 PolicyActivity를 포함하는 SequenceActivity로 구성됩니다.

Ee264174.note(ko-kr,VS.100).gif참고:
이 항목에서 만드는 .NET Framework 3.5 활동은 PolicyActivity를 사용하여 활동 논리를 구현합니다. .NET Framework 4 워크플로에서 규칙을 사용하기 위해 사용자 지정 .NET Framework 3.5 활동이나 Interop 활동을 사용할 필요는 없습니다. Interop 활동을 사용하지 않고 .NET Framework 4 워크플로에서 규칙을 사용하는 예는 .NET Framework 4의 정책 활동 샘플을 참조하십시오.

.NET Framework 3.5 활동 라이브러리 프로젝트를 만들려면

  1. Visual Studio 2010을 열고 파일 메뉴에서 새로 만들기를 선택한 다음 **프로젝트…**를 선택합니다.

  2. 설치된 템플릿 창에서 기타 프로젝트 형식 노드를 확장하고 Visual Studio 솔루션을 선택합니다.

  3. Visual Studio 솔루션 목록에서 빈 솔루션을 선택합니다. 이름 상자에 PolicyInteropDemo를 입력하고 확인을 클릭합니다.

  4. 솔루션 탐색기에서 PolicyInteropDemo를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 **새 프로젝트…**를 선택합니다.

    Ee264174.Tip(ko-kr,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(ko-kr,VS.100).gif팁:
    도구 상자 창이 표시되어 있지 않으면 보기 메뉴에서 도구 상자를 선택합니다.

규칙을 구성하려면

  1. 새로 추가된 정책 활동이 아직 선택되어 있지 않으면 클릭하여 선택합니다.

  2. 속성 창에서 RuleSetReference 속성을 클릭하여 선택하고 속성 오른쪽의 줄임표 단추를 클릭합니다.

    Ee264174.Tip(ko-kr,VS.100).gif팁:
    속성 창이 표시되어 있지 않은 경우 보기 메뉴에서 속성 창을 선택합니다.

  3. **새로 만들기…**를 클릭합니다.

  4. 규칙 추가를 클릭합니다.

  5. 조건 상자에 다음 식을 입력합니다.

    this.Subtotal >= 50 && this.Subtotal < 100
    
  6. ThenActions 상자에 다음 식을 입력합니다.

    this.DiscountPercent = 0.075
    
  7. 규칙 추가를 클릭합니다.

  8. 조건 상자에 다음 식을 입력합니다.

    this.Subtotal >= 100
    
  9. ThenActions 상자에 다음 식을 입력합니다.

    this.DiscountPercent = 0.15
    
  10. 규칙 추가를 클릭합니다.

  11. 조건 상자에 다음 식을 입력합니다.

    this.DiscountPercent > 0
    
  12. ThenActions 상자에 다음 식을 입력합니다.

    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 활동의 Subtotal, DiscountPercentTotal 속성 값을 평가하고 수정하여 원하는 할인을 계산합니다.

Interop 활동과 함께 DiscountCalculator 활동 사용

.NET Framework 4 워크플로 내에서 DiscountCalculator 활동을 사용하려면 Interop 활동을 사용합니다. 이 단원에서는 DiscountCalculator 활동과 함께 Interop 활동을 사용하는 방법을 보여 주는 두 개의 워크플로를 코드 및 Workflow Designer를 사용하여 각각 만듭니다. 두 워크플로에 동일한 호스트 응용 프로그램을 사용합니다.

호스트 응용 프로그램을 만들려면

  1. 솔루션 탐색기에서 PolicyInteropDemo를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 **새 프로젝트…**를 선택합니다.

  2. .NET Framework 버전 드롭다운 목록에서 .NET Framework 4가 선택되어 있는지 확인하고 Visual C# 항목 목록에서 워크플로 콘솔 응용 프로그램을 선택합니다.

  3. 이름 상자에 PolicyInteropHost를 입력하고 확인을 클릭합니다.

  4. 솔루션 탐색기에서 PolicyInteropHost를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  5. 대상 프레임워크 드롭다운 목록의 선택을 .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. Program 클래스에 다음 코드를 포함하는 CalculateDiscountUsingCodeWorkflow라는 새 메서드를 만듭니다.

    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(ko-kr,VS.100).gif참고:
    DiscountCalculator 활동의 Subtotal, DiscountPercentTotal 속성은 Interop 활동의 인수로 표시되고 Interop 활동의 ActivityProperties 컬렉션에서 로컬 워크플로 변수에 바인딩됩니다. SubtotalSubtotal 데이터가 Interop 활동 안으로 흐르기 때문에 In 인수로 추가되고, DiscountPercentTotal은 해당 데이터가 Interop 활동 밖으로 흐르기 때문에 Out 인수로 추가됩니다. 두 Out 인수는 Out 인수임을 나타내기 위해 DiscountPercentOutTotalOut이라는 이름으로 추가됩니다. DiscountCalculator 형식은 Interop 활동의 ActivityType으로 지정됩니다.

  5. Ctrl+F5를 눌러 응용 프로그램을 빌드하고 실행합니다. Subtotal 값에 다양한 값을 대체하여 DiscountCalculator 활동에서 제공하는 다양한 할인 수준을 테스트합니다.

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

Workflow Designer에서 Interop 활동 사용

이 예제에서는 Workflow Designer를 사용하여 워크플로를 만듭니다. 이 워크플로는 WriteLine 활동을 사용하여 할인을 표시하는 대신에 워크플로가 완료될 때 호스트 응용 프로그램이 할인 정보를 검색하여 표시한다는 점을 제외하고 이전 예제와 동일한 기능을 가집니다. 또한 로컬 워크플로 변수를 사용하여 데이터를 포함하는 대신에 Workflow Designer에서 인수가 만들어지고 워크플로가 호출될 때 호스트에서 값이 전달됩니다.

Workflow Designer에서 만든 워크플로를 사용하여 PolicyActivity를 호스팅하려면

  1. 솔루션 탐색기에서 Workflow1.xaml을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다. 확인을 클릭하여 확인합니다.

  2. 솔루션 탐색기에서 PolicyInteropHost를 마우스 오른쪽 단추로 클릭하고 추가, **새 항목…**을 선택합니다.

  3. Visual C# 항목 노드를 확장하고 워크플로를 선택합니다. Visual C# 항목 목록에서 활동을 선택합니다.

  4. 이름 상자에 DiscountWorkflow를 입력하고 추가를 클릭합니다.

  5. Workflow Designer 왼쪽 아래에서 인수 단추를 클릭하여 인수 창을 표시합니다.

  6. 인수 만들기를 클릭합니다.

  7. 이름 상자에 Subtotal을 입력하고 방향 드롭다운에서 입력을 선택한 다음 인수 형식 드롭다운에서 Double을 선택하고 Enter 키를 눌러 인수를 저장합니다.

    Ee264174.note(ko-kr,VS.100).gif참고:
    인수 형식 드롭다운 목록에 Double이 없으면 형식 찾아보기…를 선택하고 형식 이름 상자에 System.Double을 입력한 다음 확인을 클릭합니다.

  8. 인수 만들기를 클릭합니다.

  9. 이름 상자에 DiscountPercent를 입력하고 방향 드롭다운에서 출력을 선택한 다음 인수 형식 드롭다운에서 Double을 선택하고 Enter 키를 눌러 인수를 저장합니다.

  10. 인수 만들기를 클릭합니다.

  11. 이름 상자에 Total을 입력하고 방향 드롭다운에서 출력을 선택한 다음 인수 형식 드롭다운에서 Double을 선택하고 Enter 키를 눌러 인수를 저장합니다.

  12. Workflow Designer 왼쪽 아래에서 인수 단추를 클릭하여 인수 창을 닫습니다.

  13. 도구 상자흐름 제어 섹션에서 시퀀스 활동을 끌어 Workflow Designer 화면에 놓습니다.

  14. 도구 상자마이그레이션 섹션에서 Interop 활동을 끌어 시퀀스 활동에 놓습니다.

  15. 찾아보려면 클릭하십시오… 레이블에서 Interop 활동을 클릭하고 형식 이름 상자에 DiscountCalculator를 입력한 다음 확인을 클릭합니다.

    Ee264174.note(ko-kr,VS.100).gif참고:
    Interop 활동이 워크플로에 추가되고 DiscountCalculator 형식이 해당 ActivityType으로 지정되면 Interop 활동은 DiscountCalculator 활동의 세 가지 공용 속성을 나타내는 In 인수 세 개와 Out 인수 세 개를 노출합니다. 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(ko-kr,VS.100).gif참고:
    이전 절차를 따르지 않은 경우 기본 Main 코드가 있으면 Main의 내용을 다음 코드로 대체합니다.

    static void Main(string[] args)
    {
        CalculateDiscountUsingDesignerWorkflow();
        //CalculateDiscountUsingCodeWorkflow();
    }
    
  22. Program 클래스에 다음 코드를 포함하는 CalculateDiscountUsingDesignerWorkflow라는 새 메서드를 만듭니다.

    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 규칙 엔진 소개

RuleSet

워크플로에서 RuleSet 사용RuleSet

규칙 확인

RuleSet의 규칙 확인

규칙 연결

전방 연결 제어규칙의 전방 연결

규칙에서 컬렉션 처리

규칙에서 컬렉션 처리

PolicyActivity 사용

PolicyActivity 활동 사용PolicyActivity

.NET Framework 4에서 만든 워크플로는 선언적 활동 조건 및 ConditionedActivityGroup, ReplicatorActivity 등의 조건부 활동과 같은 WF에서 제공하는 모든 규칙 기능을 사용하는 것은 아닙니다. 필요할 경우 .NET Framework 3.0 및 .NET Framework 3.5를 사용하여 만든 워크플로에 이 기능을 사용할 수 있습니다. 자세한 내용은 다음 항목을 참조하십시오. 워크플로 마이그레이션.