WF4.5-表达活动类型' CSharpValue`1'需要编译才能运行

时间:2017-09-01 17:17:13

标签: c# xaml workflow-foundation-4 workflow-foundation

背景

我想要做的是在xaml中设置我的某个模型的范围变量。

在我的工作流程项目" MyProject.Workflows"我已经创建了模型类,代码活动和Xaml文件。它们都在相同的命名空间下。在另一个项目(" 引擎")中,我加载并执行这些工作流程。

要在" 引擎"中加载工作流程,我将ActivityXamlServicesActivityXamlServicesSettings一起使用,包括CompileExpressions = true

加载ActivityXamlServices时,我使用XamlXmlReader XamlXmlReaderSettings,其中我实际指向" MyProject.Workflows" DLL。

由于这两个项目都在同一个解决方案中,我实际上在" 引擎"中引用了MyProject.Workflows。

因为早些时候,他们处于不同的解决方案中,所以当我尝试这样做时它给了我它无法找到" MyProject.Workflows" dll,即使我将其指向XamlXmlReaderSettings

然后我尝试将dll加载到app域然后它工作。但我不想处理App Domains所以我决定让两个项目都在一个解决方案下,所以我可以参考" MyProject。工作流程"在"引擎"。

问题:

如果我在Xaml中使用其中一个模型作为"分配活动"当我尝试执行此操作时,工作流程未被编译。

例如,如果我在"分配"具有 MyObject

类型的范围变量的活动
Newtonsoft.Json.JsonConvert.DeserializeObject<MyProject.Workflows.Models.MyObject>(inputString);

运行工作流程时,我会收到以下错误消息。

NotSupportedException:'Expression Activity type 'CSharpValue`1' requires compilation in order to run.  Please ensure that the workflow has been compiled.

如果我删除这些对象并处理字符串或整数,它就可以正常工作。

我在研究中发现的事情:

  1. 我发现这是.Net Framework 4.5中的一个错误。但我使用4.6
  2. 即使我使用了CompileExpressions = true,我也尝试了这种编译方法。但没有改变一件事。

     private static void Compile(DynamicActivity dynamicActivity)
    {
        TextExpressionCompilerSettings settings = new TextExpressionCompilerSettings
        {
            Activity = dynamicActivity,
            Language = "C#",
            ActivityName = dynamicActivity.Name.Split('.').Last() + "_CompiledExpressionRoot",
            ActivityNamespace = string.Join(".", dynamicActivity.Name.Split('.').Reverse().Skip(1).Reverse()),
            RootNamespace = null,
            GenerateAsPartialClass = false,
            AlwaysGenerateSource = true,
        };
    
        TextExpressionCompilerResults results =
            new TextExpressionCompiler(settings).Compile();
        if (results.HasErrors)
        {
            throw new Exception("Compilation failed.");
        }
    
        ICompiledExpressionRoot compiledExpressionRoot =
            Activator.CreateInstance(results.ResultType,
                new object[] { dynamicActivity }) as ICompiledExpressionRoot;
        CompiledExpressionInvoker.SetCompiledExpressionRootForImplementation(
            dynamicActivity, compiledExpressionRoot);
    }
    
  3. 我读到有些人遇到了这个问题,他们不得不将模型移动到不同的命名空间。我也这样做了。没有解决问题。
  4. 我的Xaml文件在顶部添加了此条目。

     xmlns:local="clr-namespace:MyProject.Workflows.Models"
    

    有人可以帮我解决这个问题吗?

0 个答案:

没有答案