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的语法,没有模板字符串,没有属性初始化赋值。

posted @ 2021-06-12 16:18  trykle  阅读(596)  评论(0)    收藏  举报