C#动态编译2

思路:

  1. 通过C#的编译对象CSharpCodeProvider对一段C#代码进行编译
  2. C#代码包含命名空间、类、方法。以及需要引用的命名空间
  3. 可以在编译前增加DLL引用,这样动态的C#代码就可以使用引用DLL的方法

首先放一段需要动态编译的代码,名称为:duanjt.cs

using ConsoleApp1;

namespace DynamicCodeGenerate
{
    public class duanjt
    {
        public duanjt(){}
        
        public string SayHello(string name){
            return "hello,"+name;
        }
    }
}

然后就是核心的编译代码

static void Main(string[] args)
{
    CSharpCodeProvider p = new CSharpCodeProvider();

    // 设置编译参数
    CompilerParameters options = new CompilerParameters()
    {
        GenerateInMemory = true,
        GenerateExecutable = false,
    };

    //加入引用的程序集,可以是dll,也可以是exe
    options.ReferencedAssemblies.Add("ConsoleApp1.exe");
            
    //按引入的cs文件进行编译
    var compile = p.CompileAssemblyFromFile(options, new string[] { 
        "duanjt.cs"
    });
    if (compile.Errors.HasErrors)
    {
        Console.WriteLine("编译错误:");
        foreach (CompilerError err in compile.Errors)
        {
            Console.WriteLine(err.ErrorText);
        }
    }
    else
    {
        var type = compile.CompiledAssembly.GetType("DynamicCodeGenerate.duanjt");
        var duanjt = Activator.CreateInstance(type);
        var method = type.GetMethod("SayHello");
        var result = method.Invoke(duanjt, new object[] { "段江涛" });
        Console.WriteLine(result);
    }
    Console.ReadLine();
}

 

posted @ 2022-11-05 22:48  段江涛IT  阅读(141)  评论(0编辑  收藏  举报
页脚HTML代码