2013-12-18 4 views
0

My TFS2012 사용자 정의 빌드 워크 플로우에는 빌드 정의에 정의 된 많은 사용자 정의 매개 변수가 있습니다. 모든 것을 빌드 중에 실행되는 exe에 전달하려고합니다 (사용자 정의 활동에 대한 옵션을 알고 있지만 매번 컨트롤러의 바이너리를 변경하지 않으므로 사용할 수 없습니다). 빌드 중 ProcessParameters 작성

나는 그러나, 이것은 exe를 모두 ProcessParameters의 병합 할 필요가 있다는 것을 의미한다., buildDetail.ProcessParametersbuildDetail.buildDefinition.ProcessParameters을 파일에 기록 가능성이 WorkflowHelpers.DeserializeProcessParameters를 사용 (파싱 할, 내 EXE에 전달할 관리, 나는 ' 이를 방지하고 싶습니다.

워크 플로 내에서 결과의 processParameters을 얻을 수있는 방법은 내가 WorkflowHelpers.GetProcessParameters(Activity)를 호출 할 수 있을까? 거기에,하지만 어떻게 내가 워크 플로의 루트 활동을 얻을 것?

답변

0

을 나는 그것을 할 관리 WorkflowInstanceProxy을 유지하여 제안 된대로 here :

public class WriteProcessParameters : CodeActivity 
{ 
    protected override void Execute(CodeActivityContext context) 
    { 
     WorkflowInstanceProxy proxy = context.GetExtension<WorkflowInstanceInfo>().GetProxy(); 
     Activity root = proxy.WorkflowDefinition; 
     Dictionary<string, ProcessParameter> processParams = WorkflowHelpers.GetProcessParameters(root); 
     // Serialize processParams somehow... 
    } 

    protected override void CacheMetadata(CodeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); 
     metadata.AddDefaultExtensionProvider<WorkflowInstanceInfo>(() => new WorkflowInstanceInfo()); 
    } 

    private class WorkflowInstanceInfo : IWorkflowInstanceExtension 
    { 
     private WorkflowInstanceProxy m_proxy; 
     public IEnumerable<object> GetAdditionalExtensions() { yield break; } 
     public void SetInstance(WorkflowInstanceProxy instance) { this.m_proxy = instance; } 
     public WorkflowInstanceProxy GetProxy() { return m_proxy; } 
    } 
} 

내 장난감 테스트에서 작동했지만 실제 워크 플로에서는 작동하지 않습니다 (이유는 확실하지 않음). 그래서 나는 다음과 같이 재산을 읽었습니다.

public InArgument<string> Filename { get; set; } 

protected override void Execute(CodeActivityContext context) 
{ 
    var propDescriptors = context.DataContext.GetProperties().Cast<PropertyDescriptor>(); 
    var props = new Dictionary<string, object>(); 
    foreach (var propDesc in propDescriptors.OrderBy(p => p.Name)) 
    { 
     object value = propDesc.GetValue(context.DataContext); 
     if (value == null) 
     { 
      var converter = TypeDescriptor.GetConverter(propDesc.PropertyType); 
      if (converter.CanConvertTo(propDesc.PropertyType)) 
      { 
       value = converter.ConvertTo(value, propDesc.PropertyType); // Known case: null string 
      } 
      else 
      { 
       continue; // Known case: RunTestParameters 
      } 
     } 
     else 
     { 
      if (!value.GetType().IsVisible || !value.GetType().IsSerializable) 
      { 
       continue; 
      } 
     } 

     props.Add(propDesc.Name, value); 
    } 

    File.WriteAllText(Filename.Get(context), WorkflowHelpers.SerializeProcessParameters(props)); 
}