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的语法,没有模板字符串,没有属性初始化赋值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步