.NET : 动态生成工作流定义文件并且进行编译
2009-10-03 00:31
477 查看
最近在折腾一个动态工作流系统的事情。工作流(尤其是结合SharePoint设计的工作流)已经够麻烦了,现在还要搭上动态化这一条,多少英雄豪杰都为之前仆后继啊 我也进行过一些研究,基本思路还是有的,但真正要做出来还有很多细节。虽然通过一些曲折的办法,可以做出类似于Visual Studio中提供的那个工作流设计器界面,但其实真正做工作流的时候,用户并不喜欢那种界面。说白了,那个界面虽然很好(我个人认为它很好),但却主要是给开发人员用的。 所以,要想有所突破,就得用人民群众喜闻乐见的方式让他们去画流程,然后我们动态来编译工作流代码和程序。这些细节这里且按下不表 首先要确保引用了以下两个程序集
在代码文件的顶部添加如下的using语句
using System.Workflow.ComponentModel.Compiler;//这是编译时会用到的
using System.Workflow.ComponentModel.Serialization;//这个是保存XOML会用到的
using System.Workflow.Activities;
using System.Xml;
using System.IO;
SequenceActivity myworkflow = new SequenceActivity("Test");
myworkflow.Name = "MyWorkflow";
myworkflow.SetValue(WorkflowMarkupSerializer.XClassProperty,typeof(SequenceActivity).FullName);
DelayActivity d = new DelayActivity("delay");
d.TimeoutDuration = new TimeSpan(0, 0, 10);
myworkflow.Activities.Add(d);
using (XmlWriter xw = XmlWriter.Create("Test.xoml"))
{
WorkflowMarkupSerializer s = new WorkflowMarkupSerializer();
s.Serialize(xw, myworkflow);
} ///以上代码虽然可以生成一个xoml,但却不能进行编译,所以还需要我们强制添加下面的一个attribute XmlDocument doc = new XmlDocument();
doc.Load("Test.xoml"); XmlAttribute attrib = doc.CreateAttribute("x", "Class", "http://schemas.microsoft.com/winfx/2006/xaml");
attrib.Value = typeof(Program).Namespace + ".MyWorkflow"; //注意这个名称 doc.DocumentElement.Attributes.Append(attrib);
doc.Save("Test.xoml");
这样最后得到的一个XOML文件如下
这个文件在Visual Studio中打开的效果如下
WorkflowCompilerParameters p = new WorkflowCompilerParameters();
p.OutputAssembly = "test.dll";
WorkflowCompilerResults r = compiler.Compile(p, "test.xoml");
foreach (var item in r.Errors)
{
Console.WriteLine(item);
} 最后,就可以得到一个test.dll
其实这个WorkflowCompiler有一个对应的SDK工具:WFC.exe。也就是说,用WFC也是可以完成编译的,请参考下面的截图
假设我们在c盘下面有一个已经做好的签名文件:chenxizhang.snk
这个snk文件,可以通过下面的方式创建 sn –k chenxizhang.snk
WorkflowCompiler compiler = new WorkflowCompiler();
WorkflowCompilerParameters p = new WorkflowCompilerParameters();
p.OutputAssembly = "test.dll"; p.CompilerOptions = "/keyfile:"+@"c:/chenxizhang.snk"; WorkflowCompilerResults r = compiler.Compile(p, "test.xoml");
foreach (var item in r.Errors)
{
Console.WriteLine(item);
}
这样编译出来的dll就拥有了强名称了。通过下面的方式可以查看到其公钥信息
在代码文件的顶部添加如下的using语句
using System.Workflow.ComponentModel.Compiler;//这是编译时会用到的
using System.Workflow.ComponentModel.Serialization;//这个是保存XOML会用到的
using System.Workflow.Activities;
using System.Xml;
using System.IO;
1. 如何动态生成一个XOML文件
///动态创建工作流的XOML文件SequenceActivity myworkflow = new SequenceActivity("Test");
myworkflow.Name = "MyWorkflow";
myworkflow.SetValue(WorkflowMarkupSerializer.XClassProperty,typeof(SequenceActivity).FullName);
DelayActivity d = new DelayActivity("delay");
d.TimeoutDuration = new TimeSpan(0, 0, 10);
myworkflow.Activities.Add(d);
using (XmlWriter xw = XmlWriter.Create("Test.xoml"))
{
WorkflowMarkupSerializer s = new WorkflowMarkupSerializer();
s.Serialize(xw, myworkflow);
} ///以上代码虽然可以生成一个xoml,但却不能进行编译,所以还需要我们强制添加下面的一个attribute XmlDocument doc = new XmlDocument();
doc.Load("Test.xoml"); XmlAttribute attrib = doc.CreateAttribute("x", "Class", "http://schemas.microsoft.com/winfx/2006/xaml");
attrib.Value = typeof(Program).Namespace + ".MyWorkflow"; //注意这个名称 doc.DocumentElement.Attributes.Append(attrib);
doc.Save("Test.xoml");
这样最后得到的一个XOML文件如下
这个文件在Visual Studio中打开的效果如下
2. 如何进行编译成dll
WorkflowCompiler compiler = new WorkflowCompiler();WorkflowCompilerParameters p = new WorkflowCompilerParameters();
p.OutputAssembly = "test.dll";
WorkflowCompilerResults r = compiler.Compile(p, "test.xoml");
foreach (var item in r.Errors)
{
Console.WriteLine(item);
} 最后,就可以得到一个test.dll
其实这个WorkflowCompiler有一个对应的SDK工具:WFC.exe。也就是说,用WFC也是可以完成编译的,请参考下面的截图
3. 如何对这个dll进行签名
通常一个设计好的工作流模板需要注册到GAC,而注册到GAC的前提又是要签名,那么我们在编译的时候能不能签名呢?假设我们在c盘下面有一个已经做好的签名文件:chenxizhang.snk
这个snk文件,可以通过下面的方式创建 sn –k chenxizhang.snk
WorkflowCompiler compiler = new WorkflowCompiler();
WorkflowCompilerParameters p = new WorkflowCompilerParameters();
p.OutputAssembly = "test.dll"; p.CompilerOptions = "/keyfile:"+@"c:/chenxizhang.snk"; WorkflowCompilerResults r = compiler.Compile(p, "test.xoml");
foreach (var item in r.Errors)
{
Console.WriteLine(item);
}
这样编译出来的dll就拥有了强名称了。通过下面的方式可以查看到其公钥信息
相关文章推荐
- .NET : 动态生成工作流定义文件并且进行编译
- .NET 中的动态编译(生成exe文件)
- .NET动态生成PDF文件(利用iTextSharp)
- Java 计算器,通过动态生成并编译Java类来进行
- java生成java文件并动态编译
- 编译时出现:请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程
- 找到目录下的文件夹 并且进行压缩,然后再生成压缩文件到指定目录
- 让一个动态链接库文件debug和release编译的时候生成不同的文件名的方法
- 如何让一个动态链接库文件debug和release编译的时候生成不同的文件名
- 编译ASP.NET时,提示“请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- Myeclipse在进行“Clean”操作后重新编译无法生成Class文件
- 【转】C#生成dll文件:如何用C#编译生成dll文件即动态链接库文件供其它程序调用
- jquery 异步上传excel 文件并且进行了 前台动态展示 上传数量
- 使用C# 怎么生成.db后缀的文件,并且能够使用sql语言进行读取等 操作
- 动态编译jrxml文件生成html报表
- 编译时出现:请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- 动态代理---动态生成java文件并编译成class文件
- makefile学习经验(三)----编译生成动态库文件(方式一)
- 调用codeSmith API,l动态编译cst文件,生成exe文件可以在目前pc免安装codeSmith