背景
我想要做的是在xaml中设置我的某个模型的范围变量。
在我的工作流程项目" MyProject.Workflows"我已经创建了模型类,代码活动和Xaml文件。它们都在相同的命名空间下。在另一个项目(" 引擎")中,我加载并执行这些工作流程。
要在" 引擎"中加载工作流程,我将ActivityXamlServices
与ActivityXamlServicesSettings
一起使用,包括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.
如果我删除这些对象并处理字符串或整数,它就可以正常工作。
我在研究中发现的事情:
即使我使用了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);
}
我的Xaml文件在顶部添加了此条目。
xmlns:local="clr-namespace:MyProject.Workflows.Models"
有人可以帮我解决这个问题吗?