2013-12-18 3 views
0

Рабочий процесс пользовательской сборки TFS2012 имеет множество настраиваемых параметров, которые определены в определении моей сборки. Я хочу передать все из них в exe, который запускается во время сборки (я знаю о возможности пользовательских действий, но я не могу использовать его, так как я не хочу каждый раз менять двоичные файлы контроллера).Написание ProcessParameters во время сборки

мне удалось взять buildDetail.ProcessParameters и buildDetail.buildDefinition.ProcessParameters, записывать их в файлы и передавать их на мой ех, который будет разбирать их (возможно, с использованием WorkflowHelpers.DeserializeProcessParameters. Тем не менее, это означает, что еху нужен будет объединить оба ProcessParameters с, и я хотел бы избежать.

есть ли способ, чтобы получить в результате 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)); 
} 
Смежные вопросы