C# 动态编译并动态传入对象
创建对象并执行方法,传入一个动态对象作为参数
static object DynamicCreateAssembly(dynamic inputObject)
{
Microsoft.CSharp.CSharpCodeProvider cSharpCodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
//
System.CodeDom.Compiler.CompilerParameters compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
compilerParameters.ReferencedAssemblies.Add("System.dll");
compilerParameters.ReferencedAssemblies.Add("System.Linq.Expressions.dll");
compilerParameters.ReferencedAssemblies.Add("System.Core.dll");
compilerParameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
compilerParameters.GenerateInMemory = true;
//
string source = @"
using System;
using System.Runtime.CompilerServices;
public class Fuck {
public static string FuckMe(dynamic input)
{
Console.WriteLine(input.Age);
Console.WriteLine(input.Name);
return ""okkkk"";
}
}
";
var compilerResults = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameters, source);
if (compilerResults.Errors.Count > 0)
{
foreach (var err in compilerResults.Errors)
{
Console.WriteLine(err);
}
}
var asm = compilerResults.CompiledAssembly.CreateInstance("Fuck");
MethodInfo method = asm.GetType().GetMethod("FuckMe");
return method.Invoke(asm, new object[] { inputObject });
}
需要传入的对象
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
调用
static void Main(string[] args)
{
Person person = new Person();
person.Name = "撒飞洒发撒";
object result = DynamicCreateAssembly(person);
Console.WriteLine($"返回值:{result}");
Console.Read();
}
问题
经过一段时间的使用,使用dynamic作为类型传递的好处就是可以规避类型转换(同一个类型,名字一样,成员一样,在编译内外是2个不同的东西)
但dynamic却有一些无法接受的东西:
- 无法使用编辑器的自动提示功能,意味着你写代码必须小心翼翼
- 所以现在面临的问题是:2个对象,他们名字一样,成员一样,却不能互相转换
- 准备尝试一下序列化,但是binary的处理方式还是不太好跨越不同空间的问题
在尝试了各种序列化之后,这不是个好方法
新的方案
由主程序提供核心类,模板类引用主程序,进行继承
模板类重写子类方法进行动态脚本的传递
模板类动态编译生成后转化为子类进行数据共享,这样可以避免数据转换
同时可以使用c#新的语法,CSharpCodeProvider 据说用的是c# 3.5的语法,没有模板字符串,没有属性初始化赋值。