动态编译C#代码

项目开发中,有时候会使用到动态生成代码,然后根据动态生成的代码再执行相应的操作,C#提供了动态代码的编译,利用这个特性可以实现动态生成代码,然后执行代码。
直接上代码,c#版本

[MenuItem("Test/CreateCodeDll")]
    public static void CreateCodeDll1()
    {
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters();

        parameters.GenerateExecutable = false;
        parameters.GenerateInMemory = false;
        string path = "MyCode.dll";
        parameters.OutputAssembly = path;
        parameters.ReferencedAssemblies.Add("System");

        string sourceFile = @"
            using System;

            public class MyCode
            {
                 public static int Test(int x, int y)
                 {
                     return x+y;
                 }
             }
        ";
        CompilerResults cr = provider.CompileAssemblyFromSource(parameters, sourceFile);

        if (cr.Errors.Count > 0)
        {
            // Display compilation errors.
            Debug.LogError("Errors building " + sourceFile + " into " + cr.PathToAssembly);
            foreach (CompilerError ce in cr.Errors)
            {
                Debug.LogError(ce.ToString());
            }
        }
        else
        {
            Debug.Log("编译成功");
        }

        Assembly ass = cr.CompiledAssembly;
        object obj = ass.CreateInstance("MyCode");
        MethodInfo method = obj.GetType().GetMethod("Test");
        object result = method.Invoke(obj, new object[] { 1, 5 });
        Debug.Log(result);
    }

Unity脚本需要引用Unity自身的Dll类,代码如下

[MenuItem("Test/UnityCreateDll")]
    public static void CreateDll()
    {
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters();

        string dllPath = EditorApplication.applicationContentsPath + "/Managed/";
        Debug.Log(EditorApplication.applicationContentsPath);

        parameters.WarningLevel = 2;
        parameters.GenerateExecutable = false;
        parameters.GenerateInMemory = false;
        string path = "MyCode.dll";
        parameters.OutputAssembly = path;
        parameters.ReferencedAssemblies.Add("System");
        parameters.ReferencedAssemblies.Add(dllPath + "UnityEngine");
     //   parameters.ReferencedAssemblies.Add(dllPath + "UnityEditor");

        string[] sourceFile = new string[] {
            Application.dataPath + "/Test1.cs",
            Application.dataPath + "/Test2.cs"
        };

        CompilerResults cr = provider.CompileAssemblyFromFile(parameters, sourceFile);

        if (cr.Errors.Count > 0)
        {
            // Display compilation errors.
             Debug.LogError("Errors building " + sourceFile + " into " + cr.PathToAssembly);
            foreach (CompilerError ce in cr.Errors)
            {
                Debug.LogError(ce.ToString());
            }
        }
        else
        {
            Debug.Log("编译成功");
        }


          AssetDatabase.Refresh();
    }

这个路径是取得工程目录,也就是Assets目录的上一层目录。

关于这里编译参数的设置见:MSDN
warningLevel的含义见 MSDN

一、创建工程     如图所示,在集成开发环境的File菜单中选择New->Project打开新建工程对话框我们选择工程类型为Visual C# Projects,在模板中选择Windows  Application,在Name处输入工程名称:HelloWindows,在Location中输入保存的路径。 确定后,系统自动为你生成了程序框架。   现在我们来简单地熟悉一下这个开发环境中。     这就是我们的开发环境!   A区是我们的工具箱,包括对数据库、组件、窗体控件等的支持,我们都可以选择并加入到form中,假如你找不到Toolbox,请在菜单View中选择Toolbox以打开它。   B区是我们的设计工作区(包括对界面、代码的设计)。   C区相当于我们在VC6中的workspace:Solution Explorer可以看成是以前的FileView,ResourceView和ClassView大家一定是很熟悉了,看到Solution Explorer中的 Form1.cs了吗?这就是Form1对应的C#文件,双击它就可以对Form1进行界面设计,鼠标右键单击Form1.cs在弹出菜单中选择View Code便可以查看对应的代码。   D区是属性窗口:类似我们在VC6中资源编辑器里的属性窗口,但功能更强大,对于屏幕上的组件比如按钮、列表框你都可以在这里直接修改其属性:如文字、背景色等。     我们接下去的任务是制作关于对话框,并添加菜单用于打开此对话框。     二、添加新的Form:关于对话框   选择菜单Project->Add Windows Form,在弹出的对话框中选择类别为Local Project Items,选择模板为Windows Form,在Name中输入文件名:AboutDlg.cs,确认。新的Form出现在工作区,我们在D区的属性对话框中修改Text为“关于”,选择BackColor为淡蓝色,你也可以尝试其它属性的改变。   接下去,我们打开Toolbox,选择Win Forms中的Label,然后在窗体中画出,并在属性对话框中修改Text为"VC知识库欢迎您!   http://www.vckbase.com",我们在Win Forms中再加入一个Button,修改Text为“确认”。     至此,对话框的界面我们设计好了,但当用户按下确认按钮的时候,我们如何关闭对话框呢?我们双击“确认”按钮,这样系统会为按钮自动添加按钮的处理代码,在其中我们添加Close()函数用以关闭,如下所示:     protected void button1_Click (object sender,   System.EventArgs e)   {   Close(); ///这是我们增加的一句   }     关于对话框已经完成了,我们接下去要做的是为主视窗添加菜单,当选择菜单中的关于,我们就弹出“关于对话框”,让我们继续吧...     三、为主视窗添加菜单     在SolutionView中双击Form1.cs打开Form1,在Toolbox->Win Forms中选择MainMenu,并在Form1中画出,在“TypeHere”字样处我们可以输入菜单条。     双击关于字样,系统会为我们添加该菜单条的处理代码,我们可以在其中添加打开"关于对话框"的代码:     protected void button1_Click (object sender,   System.EventArgs e)   {   AboutDlg dlg = new AboutDlg();///分配AboutDlg对象   dlg.ShowDialog();///显示对话框   }     好了,我们的程序写好了,让我们按F5看看效果吧!     后记:C#的功能远远不止与此,本文的目的是让用过VC6的朋友对C#中   WINDOWS应用程序的开发尽快上手,只当抛砖引玉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值