.NET : 动态生成工作流定义文件并且进行编译
最近在折騰一個動態(tài)工作流系統(tǒng)的事情。工作流(尤其是結(jié)合SharePoint設(shè)計的工作流)已經(jīng)夠麻煩了,現(xiàn)在還要搭上動態(tài)化這一條,多少英雄豪杰都為之前仆后繼啊
我也進(jìn)行過一些研究,基本思路還是有的,但真正要做出來還有很多細(xì)節(jié)。雖然通過一些曲折的辦法,可以做出類似于Visual Studio中提供的那個工作流設(shè)計器界面,但其實真正做工作流的時候,用戶并不喜歡那種界面。說白了,那個界面雖然很好(我個人認(rèn)為它很好),但卻主要是給開發(fā)人員用的。
?
所以,要想有所突破,就得用人民群眾喜聞樂見的方式讓他們?nèi)ギ嬃鞒?#xff0c;然后我們動態(tài)來編譯工作流代碼和程序。這些細(xì)節(jié)這里且按下不表
?
首先要確保引用了以下兩個程序集
?
在代碼文件的頂部添加如下的using語句
using System.Workflow.ComponentModel.Compiler;//這是編譯時會用到的
using System.Workflow.ComponentModel.Serialization;//這個是保存XOML會用到的
using System.Workflow.Activities;
using System.Xml;
using System.IO;
1. 如何動態(tài)生成一個XOML文件
///動態(tài)創(chuàng)建工作流的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,但卻不能進(jìn)行編譯,所以還需要我們強制添加下面的一個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文件如下
<?xml version="1.0" encoding="utf-8"?>
<SequenceActivity x:Name="MyWorkflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow" x:Class="WorkflowHelper.MyWorkflow">
? <DelayActivity TimeoutDuration="00:00:10" x:Name="delay" />
</SequenceActivity>
這個文件在Visual Studio中打開的效果如下
?
2. 如何進(jìn)行編譯成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有一個對應(yīng)的SDK工具:WFC.exe。也就是說,用WFC也是可以完成編譯的,請參考下面的截圖
3. 如何對這個dll進(jìn)行簽名
通常一個設(shè)計好的工作流模板需要注冊到GAC,而注冊到GAC的前提又是要簽名,那么我們在編譯的時候能不能簽名呢?
假設(shè)我們在c盤下面有一個已經(jīng)做好的簽名文件:chenxizhang.snk
這個snk文件,可以通過下面的方式創(chuàng)建 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就擁有了強名稱了。通過下面的方式可以查看到其公鑰信息
轉(zhuǎn)載于:https://www.cnblogs.com/chenxizhang/archive/2009/10/03/1577683.html
總結(jié)
以上是生活随笔為你收集整理的.NET : 动态生成工作流定义文件并且进行编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单JS实现走马灯效果的文字(无需jQu
- 下一篇: linux 查找目录或文件