2017-06-15 19 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

Sizzle Finger的答案是沒有解決辦法,但指出我正確的方向來簡單地檢查什麼是不同的。它出來了,簡單的調用基類方法丟失:

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