Невозможно проверить или запустить рабочий процесс в Windows Workflow Foundation, созданный с помощью System.Activities.ActivityBuilder, если он содержит Visual Basic выражения

Эта статья поможет устранить проблему, из-за которой невозможно проверить или запустить рабочий процесс в Windows Workflow Foundation (WCF), созданный с помощью, если он содержит Visual Basic System.Activities.ActivityBuilder выражения.

Исходная версия продукта:   Windows Workflow Foundation
Исходный номер КБ:   2018455

Симптомы

При проверке или выполнении рабочего процесса, созданного с помощью приложения Microsoft WCF, создается следующее System.Activities.ActivityBuilder исключение:

Необработано исключение: System.Activities.InvalidWorkflowException: при обработке дерева рабочего процесса произошли следующие ошибки:
"DynamicActivity": частная реализация действия "1: DynamicActivity" имеет следующую ошибку проверки: ошибки компиляторов столкнулись с выражением обработки "variable1. Имя".
Переменная1 не объявлена. Он может быть недоступен из-за уровня защиты.

Причина

Эта проблема возникает из-за того, что при сохранения рабочего процесса атрибут не включается в корневой элемент System.Activities.ActivityBuilder XAML-файла, как показано в VisualBasic.Settings следующем примере:

 <Activity x:Class="CustomActivity" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:w="clr-namespace:WorkflowConsoleApplication1;assembly=WorkflowConsoleApplication1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
     <Sequence>  
         <Sequence.Variables>  
         <Variable x:TypeArguments="w:MyCustomType" Name="variable1" />  
         </Sequence.Variables>  
         <WriteLine Text="[variable1.Name]" />  
     </Sequence>  
 </Activity> 

Этот атрибут необходим для Visual Basic для разрешения типов, используемых в выражении, с соответствующими сборками.

Решение

Чтобы устранить эту проблему, вручную добавьте следующие два атрибута в корневой элемент XAML-файла.

 xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities"  
 mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation"

После добавления этих двух атрибутов рабочий процесс, показанный в разделе "Признаки", отображается следующим образом:

 <Activity x:Class="CustomActivity" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:w="clr-namespace:WorkflowConsoleApplication1;assembly=WorkflowConsoleApplication1" xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation">
    <Sequence>
        <Sequence.Variables>
            <Variable x:TypeArguments="w:MyCustomType" Name="variable1" />
        </Sequence.Variables>
        <WriteLine Text="[variable1.Name]" />
    </Sequence>
</Activity>

Кроме того, можно также создать программный обходной путь. Для этого добавьте следующий код после того, как вы установите, как builder.Implementation показано в следующем примере кода:

VisualBasic.SetSettingsForImplementation(builder, new VisualBasicSettings()
{
    ImportReferences =
    {
        new VisualBasicImportReference
        {
           Assembly = "ConsoleApplication1",
           Import = "ConsoleApplication1",
        },
    }
});