2017-06-15 4 views
0

これはWindowsワークフローでC#式を使用する際の既知のエラーです。 https://docs.microsoft.com/en-us/dotnet/framework/windows-workflow-foundation/csharp-expressions#CodeWorkflowsの記事は、その理由とその修正方法を説明しています。標準的なワークフローではすべてうまく動作しますが、カスタムNativeActivityをWFに追加すると、同じエラーが再び表示されます。XAMLでNativeActivityが読み込まれましたCOMPILEDワークフローがスローされました式アクティビティの種類 'CSharpValue1'が実行するためにコンパイルが必要

以下は、XAMLワークフローと単純なNativeActivity(テストワークフロー内の唯一のアクティビティであり、そのアクティビティ内には単純な代入式です)をロードするコードです。

ロードとXAMLを経由してWFを呼び出す:コードでそれをやって

`XamlXmlReaderSettings settings = new XamlXmlReaderSettings() 
{ 
    LocalAssembly = GetContextAssembly() 
}; 
XamlReader reader = reader = ActivityXamlServices.CreateReader(new XamlXmlReader(fileURL, settings)); 
ActivityXamlServicesSettings serviceSettings = new ActivityXamlServicesSettings 
{ 
    CompileExpressions = true 
}; 
var activity = ActivityXamlServices.Load(reader, serviceSettings); 
WorkflowInvoker.Invoke(activity);` 

は、同じ例外がスローされます。

Variable<string> foo = new Variable<string> 
      { 
       Name = "Foo" 
      }; 
      Activity activity = new Sequence 
      { 

       Variables = { foo }, 
       Activities = 
       { 
        new TimeExecuteUntilAborted 
        { 
         Activities = 
         { 
          new Assign<string> 
          { 
           To = new CSharpReference<string>("Foo"), 
           Value = new CSharpValue<string>("new Random().Next(1, 101).ToString()") 
          } 
         } 
        } 
       } 
      }; 

      CompileExpressions(activity);//the method from the article mentioned above 
      WorkflowInvoker.Invoke(activity); 

ネイティブ活動:

[Designer("System.Activities.Core.Presentation.SequenceDesigner, System.Activities.Core.Presentation")] 
public sealed class TimeExecuteUntilAborted : NativeActivity 
{ 
    private Sequence innerSequence = new Sequence(); 

    [Browsable(false)] 
    public Collection<Activity> Activities 
    { 
     get 
     { 
      return innerSequence.Activities; 
     } 
    } 

    [Browsable(false)] 
    public Collection<Variable> Variables 
    { 
     get 
     { 
      return innerSequence.Variables; 
     } 
    } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     metadata.AddImplementationChild(innerSequence); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     context.ScheduleActivity(innerSequence); 
    } 
} 

答えて

0

あなたTimeExecutedUntilAbortedクラスがあると思われます犯人。代わりに自分のテンプレートNativeActivitiesの1つでスワップでき、ワークフローは式で正常に実行されました。私はあなたのクラスがあなたのコードを解析するときにコンパイラメソッドで問題を引き起こしていると推測しています。私はNativeActivityの例としてこの文書を使用しました:https://msdn.microsoft.com/en-us/library/system.activities.nativeactivity(v=vs.110).aspx

0

シズルフィンガーの答えは解決策ではありませんが、何が違うかを単に確認するために正しい方向に私を指摘しました。基本クラスメソッドへの単純な呼び出しが欠落していることが判明しました。

protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); // !! This needs to be added 
     metadata.AddImplementationChild(innerSequence); 
    } 
関連する問題