首页 > 编程语言 >C#将字符串编译成程序集并执行

C#将字符串编译成程序集并执行

时间:2023-06-15 20:55:31浏览次数:34  
标签:Console codeStr C# 编译成 System outPut 字符串 using cp

实现将字符串编译为代码并在程序中使用,实际应用可将字符串保存在文件中,程序启动后读取文件中字符转换为代码执行,这样只需要修改文件不改动代码就可以增删或修改程序功能,提高程序的灵活性。

例如,要实现下面的代码:

using System;
namespace TestSpace
{
    class Test
    {
        public void outPut(string value)
        {
            Console.WriteLine("RCV:" + value);
            Console.WriteLine(DateTime.Now.ToString());
        }
    }
}

首先添加引用:

using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

将上面的代码写成字符串:

string codeStr = "using System;";
codeStr += "namespace TestSpace{";
codeStr += "class Test{";
codeStr += "public void outPut(string value){";
codeStr += "Console.WriteLine(\"RCV:\"+value);";
codeStr += "Console.WriteLine(DateTime.Now.ToString());";
codeStr += "}}}";

下面是代码实现:

CSharpCodeProvider cs = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.GenerateExecutable = false;
cp.ReferencedAssemblies.Add("System.dll");
CompilerResults cr = cs.CompileAssemblyFromSource(cp, codeStr);//返回字符串的编译结果
Assembly ass = cr.CompiledAssembly;//获取编译的程序集
object obj = ass.CreateInstance("TestSpace.Test");//创建程序集中TestSpace命名空间下Test类的实例
MethodInfo mi = obj.GetType().GetMethod("outPut");//使用反射获得该实例的outPut方法
mi.Invoke(obj, new object[] { "12345" });//执行实例的outPut方法,并传入参数
Console.ReadLine();

执行结果:

 

标签:Console,codeStr,C#,编译成,System,outPut,字符串,using,cp
From: https://www.cnblogs.com/cfsl/p/17460618.html

相关文章

  • Scala基本语法
    scala的基本语法注释对于scala的注释,简而言之就是一句话,和java的注释一模一样基本语法(1)单行注释://(2)多行注释:/**/(3)文档注释:/****/代码示例:packagecom.doitedu.demo01objectTestNotes{defmain(args:Array[String]):Unit={//(1)......
  • c++多线程 std::async std::future
    c++标准库中对线程操作有完善的封装,其中最常用到的如std::thread,std::async。EffectiveModernCpp中指出,应尽量使用std::async即基于任务的编程而非基于线程的编程。std::thread在前面的文章有提到过,此处仅对std::async作以记录。正如前面所说,std::async是基于任务的策略,本人理......
  • celery笔记四之在Django中使用celery
    本文首发于公众号:Hunter后端原文链接:celery笔记四之在Django中使用celery这一篇笔记介绍一下如何在Django系统中使用celery。如果是想纯粹使用celery,这一篇笔记可以略过。本篇笔记目录如下:文件配置task定义运行worker1、文件配置我们这里使用前面的创建的hunt......
  • 扩展CRT
    考虑递推假设对于前\(i\)个线性同余方程,我们得到了\(x\)的一个解其通解显然为\(x+k*M_i\)其中\(M\)为前\(i\)个方程的最小公倍数对于第\(i+1\)个方程,我们需要求出\(x+t*M_i\equiva_{i+1}(mod\,\,m_{i+1})\)中的t值exgcd求解同余方程即可这样推n次即可得......
  • Oracle外连接等价于反连接的情况
     Oracle外连接等价于反连接的情况 在Oracle外连接等价于内连接的情况中提到了外连接中被驱动表的字段作为谓词条件出现在where中,并且不为isnull的话,等价于内连接。当外连接中被驱动表的连接列作为谓词条件出现在where中,且是做isnull过滤,若select出现的列都属于驱动表的时......
  • CF1830E Bully Sort
    题面传送门我们考虑选中的\(i\),这个位置一定是\(p_i>i\),它想要往后走。而和它交换的\(j\),因为\(\leqi\)的有\(i\)个数,现在第\(i\)个位置已经被\(p_i\)占据了,所以\(\leqi\)的至少有一个在\(i\)后面所以和\(p_i\)交换的\(p_j\)一定\(\leqi\),也就是说,我们选......
  • 「解题报告」CF1738H Palindrome Addicts
    神秘回文串题。首先容易发现要求的是区间本质不同回文串个数,所以直接上论文做法即可。容易想到增量构建回文自动机,假如现在建出了\([1,r]\)的PAM,考虑有多少回文串出现在了\([l,r]\)内。考虑记录每个回文串的最后一次出现位置\(last_p\),那么这个串的左端点就是\(last_p......
  • C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次
    C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次_vsto右键快捷方式word_话与山鬼听的博客-CSDN博客 Word2016不会响应WindowBeforeRightClick事件的Bug问题 ......
  • python: enforcing type check on function using decorator
     deftypeassert(*ty_args,**ty_kwargs):"""利用装饰器对函数参数强制性类型检查enforcingtypecheckonfunctionusingdecorator:paramty_args::paramty_kwargs::return:"""......
  • (2023.6.15)linux下can的调试工具交叉编译
    //源码包路径:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2//编译命令./configure--host=arm-linux-gnueabihf--prefix=/home/fangzeli/work/......