c#动态编译执行对象方法示例 运用映射机制创建对象

 更新时间:2014年01月16日 11:14:10   作者:  
本示例核心技术是运用.NET动态编译技术+.NET映射技术,把一个代码块中的代码,动态编译成程序集后,在运用映射机制,创建对象示例,调用对象方法

C#是一种编译型的语言,程序执行,首先要经过编译器编译,如何让C#像一种脚本一样,在要执行的时候,进行编译,这里,我们可以用Microsoft.CSharp空间下的CSharpCodeProvider提供类,来达到动态编译的效果。在这里,我新建一个控制台程序,在Program.cs类里引用using System.CodeDom.Compiler;
using System.Reflection;using Microsoft.CSharp;三大命名空间

复制代码 代码如下:

#region using directiry
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
#endregion
/*==============================================================================
 *
 * author:lichaoqiang@163.com
 * link:http://my.oschina.net/lichaoqiang
 *
 *
 * ============================================================================*/
namespace CodeDom
{
    class Program
    {
        #region 主程序入口
        /// <summary>
        ///主程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //1>实例化C#代码服务提供对象
            CSharpCodeProvider provider = new CSharpCodeProvider();
            //2>声明编译器参数
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.GenerateInMemory = true;
            try
            {
                //3>动态编译
                CompilerResults result = provider.CompileAssemblyFromSource(parameters, BuildCSharpCode());
                if (result.Errors.Count > 0)
                {
                    Console.Write("编译出错!");
                }
                //4>如果编译没有出错,此刻已经生成动态程序集LCQ.LCQClass
                //5>开始玩C#映射
                Assembly assembly = result.CompiledAssembly;
                object obj = assembly.CreateInstance("LCQ.LCQClass");
                Type type = assembly.GetType("LCQ.LCQClass");
                //6>获取对象方法
                MethodInfo method = type.GetMethod("Sum");
                object[] objParameters = new object[2] { 1, 5 };
                int iResult = Convert.ToInt32(method.Invoke(obj, objParameters));//唤醒对象,执行行为
                Console.Write(iResult);
                Console.Read();
            }
            catch (System.NotImplementedException ex)
            {
                Console.Write(ex.Message);
            }
            catch (System.ArgumentException ex)
            {
                Console.Write(ex.Message);
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
        }
        #endregion

        #region 生成代码块
        /// <summary>
        /// 生成代码块
        /// </summary>
        /// <returns></returns>
        private static string BuildCSharpCode()
        {
            string fileName = AppDomain.CurrentDomain.BaseDirectory.Replace("Debug", string.Empty).Replace("Release", string.Empty) + "CodeFile.cs";
            string strCodeDom = File.ReadAllText(fileName);
            return strCodeDom;
        }
        #endregion
    }
}

相关文章

  • C#实现炫酷启动图-动态进度条效果

    C#实现炫酷启动图-动态进度条效果

    这篇文章主要介绍了基于C#实现炫酷启动图-动态进度条 效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • C#通过委托调用Button单击事件的方法

    C#通过委托调用Button单击事件的方法

    本文给大家分享的是通过委托取消Button事件switch-case的方法,十分的简单实用,有需要的小伙伴可以参考下。
    2015-05-05
  • C# 线程同步详解

    C# 线程同步详解

    本文主要介绍了C#中线程同步的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#类继承自泛型集合的例子

    C#类继承自泛型集合的例子

    在C#中,除了泛型字典外,你还可以继承其他集合类型,本文通过实例代码主要介绍了C#类继承自泛型集合,需要的朋友可以参考下
    2024-08-08
  • C#向Word文档中添加内容控件的方法示例

    C#向Word文档中添加内容控件的方法示例

    这篇文章主要给大家介绍了C#向Word文档中添加内容控件的方法,文中对各种不同控件的添加方法分别进行了介绍,如组合框、文本、图片、日期选取器及下拉列表等内容控件,都给出了详细的示例代码,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • C#序列化成XML注意细节

    C#序列化成XML注意细节

    最常用的序列化是把某个类序列化成二进制文件.但有时我们也会把类序列化成xml文件,需要的朋友可以参考下
    2012-11-11
  • C#基于纯数学方法递归实现货币数字转换中文功能详解

    C#基于纯数学方法递归实现货币数字转换中文功能详解

    这篇文章主要介绍了C#基于纯数学方法递归实现货币数字转换中文功能,涉及C#针对字符串的遍历、转换与数学运算相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • C#如何将Excel转换为PDF

    C#如何将Excel转换为PDF

    这篇文章主要介绍了C#如何将Excel转换为PDF问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#使用对象序列化类库MessasgePack

    C#使用对象序列化类库MessasgePack

    这篇文章介绍了C#使用对象序列化类库MessasgePack的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 用C#缩小照片上传到各种空间的具体方法

    用C#缩小照片上传到各种空间的具体方法

    这篇文章介绍了用C#缩小照片的具体方法,有需要的朋友可以参考一下
    2013-09-09

最新评论