现在写的项目涉及了在.net standard下的动态编译,这篇文章就是来记录一下实现动态编译的过程。
CodeDom
一开始我使用的是System.CodeDom,在运行时会报错提示平台不支持的错误,在查询后发现.Net Standard不支持System.CodeDom,需要在上面一层建立和Roslyn依赖关系。Roslyn是一种.net 编译器。这一层也有人提供,叫Microsoft.CodeDom.Providers.DotNetCompilerPlatform。但我这次的实现并没有用到这个。
用Roslyn实现动态编译
比起绕来绕去,就干脆直接用Roslyn实现感觉会更有效率。
需要的nuget包:
整个动态编译的过程如下:
- 获取需要编译的完整代码
我的代码的内容主要是提供一个判断转换条件,给出转换结果的函数。这里给出一个测试案例对应生成的动态代码。
using System;
using System.Collections.Generic;
namespace Transitions
{
public class GetTransitions
{
public string getTransition(params object[] Parameters)
{
Dictionary<string, object> AliasValue = Parameters[0] as Dictionary<string, object>;
int stateNo = (int)Parameters[1];
System.Int32? numA = AliasValue["numA"] as System.Int32?;
System.Int32? numB = AliasValue["numB"] as System.Int32?;
System.Int32? numC = AliasValue["numC"] as System.Int32?;
System.String strD = AliasValue["strD"] as System.String;
switch(stateNo)
{
case 0:
if(numA >10){
return "goB";