日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET : 动态生成工作流定义文件并且进行编译

發布時間:2025/5/22 asp.net 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET : 动态生成工作流定义文件并且进行编译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在折騰一個動態工作流系統的事情。工作流(尤其是結合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;

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文件如下

<?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. 如何進行編譯成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就擁有了強名稱了。通過下面的方式可以查看到其公鑰信息

轉載于:https://www.cnblogs.com/chenxizhang/archive/2009/10/03/1577683.html

總結

以上是生活随笔為你收集整理的.NET : 动态生成工作流定义文件并且进行编译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。