Nie można zweryfikować ani uruchomić przepływu pracy w programie Windows Workflow Foundation, który został utworzony przy użyciu elementu System.Activities.ActivityBuilder, jeśli zawiera on wyrażenia Języka Visual Basic

Ten artykuł pomaga rozwiązać problem polegający na tym, że nie można zweryfikować ani uruchomić przepływu pracy w programie Windows Workflow Foundation (WCF), który został utworzony przy użyciu polecenia System.Activities.ActivityBuilder , jeśli zawiera wyrażenia języka Visual Basic.

Oryginalna wersja produktu: Windows Workflow Foundation
Oryginalny numer KB: 2018455

Symptomy

Po zweryfikowaniu lub wykonaniu przepływu pracy, który został utworzony przy użyciu System.Activities.ActivityBuilder w aplikacji Microsoft WCF, zgłaszany jest następujący wyjątek:

Nieobsługiwany wyjątek: System.Activities.InvalidWorkflowException: Podczas przetwarzania drzewa przepływu pracy wystąpiły następujące błędy:
"DynamicActivity": Prywatna implementacja działania "1: DynamicActivity" ma następujący błąd weryfikacji: Napotkano błędy kompilatora przetwarzania wyrażenia "variable1. Nazwa".
Wartość "variable1" nie jest zadeklarowana. Może być niedostępny ze względu na poziom ochrony.

Przyczyna

Ten problem występuje, ponieważ System.Activities.ActivityBuilder nie uwzględnia VisualBasic.Settings atrybutu w elemencie głównym pliku XAML podczas zapisywania przepływu pracy, jak pokazano w poniższym przykładzie:

 <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> 

Ten atrybut jest wymagany w przypadku wyrażeń języka Visual Basic do rozpoznawania typów używanych w wyrażeniu do odpowiednich zestawów.

Rozwiązanie

Aby rozwiązać ten problem, ręcznie dodaj następujące dwa atrybuty do elementu głównego pliku XAML.

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

Po dodaniu tych dwóch atrybutów przepływ pracy wyświetlany w sekcji "Objawy" jest wyświetlany w następujący sposób:

 <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>

Ponadto można również utworzyć obejście programowe. Aby to zrobić, dodaj następujący kod po ustawieniu builder.Implementationpolecenia , jak pokazano w poniższym przykładowym kodzie:

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