簡體   English   中英

加載XAML的COMPILED工作流中的NativeActivity引發Expression Activity類型“ CSharpValue1”需要進行編譯才能運行

[英]NativeActivity in XAML loaded COMPILED workflow throws Expression Activity type 'CSharpValue1' requires compilation in order to run

在Windows工作流程中使用C#表達式時,這是一個已知的錯誤。 https://docs.microsoft.com/zh-cn/dotnet/framework/windows-workflow-foundation/csharp-expressions#CodeWorkflows上的文章介紹了原因及其解決方法。 在標准工作流程中,一切都對我來說很好,但是一旦我向WF添加自定義NativeActivity,我就會再次遇到相同的錯誤!

在我如何加載XAML工作流和簡單NativeActivity的代碼下面(這是測試工作流中的唯一活動,而在該活動內部是一個簡單的assign表達式)。

通過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);
    }
}

您的TimeExecutedUntilAborted類似乎是罪魁禍首。 我可以交換我自己的模板NativeActivities之一,並且您的工作流使用表達式執行得很好。 我猜想您的類在解析代碼時會在編譯器方法中引起問題。 我以此文檔為我的NativeActivity的示例: https ://msdn.microsoft.com/zh-cn/library/system.activities.nativeactivity( v= vs.110).aspx。

Sizzle Finger的答案不是解決方案,而是為我指出了正確的方向,只是檢查有什么不同。 結果是缺少對基類方法的簡單調用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM