c#动态编译执行对象方法示例 运用映射机制创建对象
时间:2023-11-19 22:39:32
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
}
}
标签:创建对象,动态编译
0
投稿
猜你喜欢
详解Android获取设备唯一ID的几种方式
2022-07-15 12:33:41
springboot集成opencv实现人脸识别功能的详细步骤
2023-10-07 00:38:22
C#判断字符串是否存在字母及字符串中字符的替换实例
2022-04-15 03:49:48
C#反射在实际应用中的实例代码
2022-11-25 05:06:21
C#泛型方法在lua中表示的一种设计详解
2022-08-24 20:03:12
Java使用组件编写窗口实现网络图片显示
2023-04-14 18:06:04
Android实现语音播放与录音功能
2022-01-21 15:39:09
一篇文章带你了解java接口与继承
2022-07-15 02:44:08
c# 将Datatable数据导出到Excel表格中
2023-12-26 02:03:53
C#操作FTP出现500错误解决办法
2022-06-05 16:20:26
c# 几个常见的TAP异步操作
2021-11-09 21:33:36
java实现简单猜数字
2022-12-31 16:20:02
使用C++程序获取新浪行情数据的方法
2022-06-16 13:14:35
java导出Excel通用方法实例
2023-10-27 04:43:33
Java跨域问题的处理详解
2021-07-05 12:55:18
SpringBoot中@ConfigurationProperties 配置绑定
2023-04-07 04:02:57
Java中的递归方法示例介绍
2023-07-20 18:04:11
springboot中validator数据校验功能的实现
2021-07-31 17:43:50
Android实现微信支付功能
2023-08-04 19:09:03
解决IntelliJ IDEA中鼠标拖动选择为矩形区域问题
2022-04-03 21:08:51