《WF编程》系列之10 - 编译工作流:使用WorkflowCompiler类
2008-08-27 12:56
309 查看
《WF编程》系列之10 - 编译工作流:使用WorkflowCompiler类
2.3.2.2 使用WorkflowCompiler类
我们可以使用WorkflowCompiler类和WorkflowCompilerResults类以编程的方式来编译工作流定义并得到一个程序集.其实Wfc.exe就是通过使用WorkflowCompiler类来执行编译过程的.下图是和编译相关的几个类:![](http://images.cnblogs.com/cnblogs_com/xiaoshatian/88811/o_2_5_completeclass.png)
在使用WorkflowCompiler类之前,我们需要设置WorkflowCompilerParameters对象.我们可以使用这个参数对象来引用任何包含自定义活动的程序集.
WorkflowCompiler compiler = new WorkflowCompiler();
WorkflowCompilerParameters parameters;
parameters = new WorkflowCompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("chapter2_Host.exe");
string[] xomlFiles = { @"..\..\purexaml\purexaml3.xoml" };
WorkflowCompilerResults compilerResults;
compilerResults = compiler.Compile(parameters, xomlFiles);
注意,Compile方法的参数之一是字符串数组,我们可以通过它一次性传递多个XOML文件给WorkflowCompiler.如果编译失败,编译结果的Errors属性将包含错误的详细信息.
if (compilerResults.Errors.Count > 0)
{
foreach (CompilerError error in compilerResults.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
使用WorkflowCompiler编译的工作流和使用Wfc.exe编译的工作流程序集差别不大.我们不再需要Type.GetType方法,而是直接从编译结果中获取类型.
using (WorkflowRuntime runtime = new WorkflowRuntime())
using (AutoResetEvent waitHandle = new AutoResetEvent(false))
{
runtime.WorkflowCompleted += delegate { waitHandle.Set(); };
runtime.WorkflowTerminated += delegate { waitHandle.Set(); };
Type workflowType;
workflowType =
compilerResults.CompiledAssembly.GetType("MyWorkflow");
WorkflowInstance instance = runtime.CreateWorkflow(workflowType);
instance.Start();
waitHandle.WaitOne();
}
关于编译过程,还有两个有趣的实现细节值得在这里提一下:
WorkflowCompiler每次调用Compile方法时都创建新的应用程序域(AppDomain),所以在设计应用程序时,要提防应用程序在它的生命周期内多次调用Compile方法.
如果GenerateInMemory参数设置为true而且可以编译成功,Compile方法会自动加载新的程序集到当前应用程序域(AppDomain),.如果你不需要立即加载程序集,请将GenerateInMemory设置为false.
相关文章推荐
- 《WF编程》系列之10 - 编译工作流:使用WorkflowCompiler类
- 《WF编程》系列之9 - 编译工作流:使用WFC.EXE
- 《WF编程》系列之9 - 编译工作流:使用WFC.EXE
- 《WF编程》系列之11 - 编译工作流:使用MSBUILD
- 《WF编程》系列之11 - 编译工作流:使用MSBUILD
- 《WF编程》系列之12 - 编译工作流:XAML序列化
- 《WF编程》系列之12 - 编译工作流:XAML序列化
- 使用VS进行工作流开发系列博客3-Developing Workflows in VS: Part 2 - Planning Your Workflow: Two Things to Keep in Mind
- 《WF编程》系列之5 - 漫游工作流:第一个工作流
- 《WF编程》系列之14 - 工作流编写方式:结合代码与XAML 2.4结合代码与XAML
- 一步一步学Silverlight 2系列(10):使用用户控件
- Red Gate系列之五 .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程
- 一步一步学Silverlight 2系列(10):使用用户控件
- IronPython系列:使用CodeDom动态地编译执行代码
- 《WF编程》系列- 承载工作流:持久化与跟踪
- 【系列3】使用Dockerfile创建带编译安装nginx服务的Centos Docker镜像
- Maven学习总结(10)——使用Maven编译项目gbk的不可映射问题
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
- 《WF编程》系列之43 - 承载工作流:持久性服务 Persistence Services
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例