首页 > 编程语言 >c# 简单的动态执行字符串

c# 简单的动态执行字符串

时间:2023-10-12 12:26:17浏览次数:41  
标签:Main 编译 c# results System C# 字符串 using 动态

在 C# 中,可以使用 `CSharpCodeProvider` 类动态执行 C# 代码。以下是一个示例,演示了如何动态执行 C# 命令:

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

class Program
{
static void Main()
{
// 创建 CSharpCodePrivider 实例
CSharpCodeProvider provider = new CSharpCodeProvider();

// 设置编译参数
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true; // 编译后的程序集保存在内存中

// 编译代码
CompilerResults results = provider.CompileAssemblyFromSource(parameters, @"using System;
public class Program
{
public void Main()
{
Console.WriteLine(""Hello, World!"");
}
}");

// 检查编译结果
if (results.Errors.HasErrors)
{
foreach (CompilerError error in results.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
else
{
// 获取编译后的程序集
Assembly assembly = results.CompiledAssembly;

// 获取程序集中的类型
Type programType = assembly.GetType("Program");

// 创建类型的实例
object programInstance = Activator.CreateInstance(programType);

// 获取类型中的方法
MethodInfo mainMethod = programType.GetMethod("Main");

// 调用方法
mainMethod.Invoke(programInstance, null);
}
}
}
```

在上述示例中,我们首先创建了一个 `CSharpCodeProvider` 实例,然后设置了编译参数,其中 `GenerateInMemory` 属性设置为 `true`,表示编译后的程序集保存在内存中。

接下来,我们使用 `CompileAssemblyFromSource` 方法编译了一段 C# 代码,并将编译结果保存在 `CompilerResults` 对象中。

然后,我们检查编译结果,如果有错误,则打印错误信息。如果编译成功,则获取编译后的程序集,并通过反射获取程序集中的类型。

接着,我们创建了类型的实例,并获取类型中的 `Main` 方法。最后,我们使用 `Invoke` 方法调用了 `Main` 方法。

注意:在动态执行 C# 命令时,请确保您信任要执行的代码,以防止潜在的安全风险。

标签:Main,编译,c#,results,System,C#,字符串,using,动态
From: https://www.cnblogs.com/chinasoft/p/17759213.html

相关文章

  • C++ 11 Lambda表达式
    C++11Lambda表达式 C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......
  • 为什么我们需要不断的开发不同的机器学习模型 —— Do we Need Hundreds of Classifie
        ==========================================  论文:《DoweNeedHundredsofClassifierstoSolveRealWorldClassificationProblems?》  论文地址:https://jmlr.org/papers/volume15/delgado14a/delgado14a.pdf        =========......
  • 基于Flask搭建MockServer
    什么是mock创建一个模拟对象来代替实际的依赖项,以便进行各类测试。模拟对象可以模拟实际对象的行为,以便在测试过程中进行控制和验证类似于写了一个假的接口,返回我们想要的响应数据,类似于挡板,方便测试进行实际场景工作当中,支付等场景,不会进行真实的支付场景,会利用沙......
  • 记一次Redis Cluster Pipeline导致的死锁问题
    作者:vivo互联网服务器团队-LiGang本文介绍了一次排查Dubbo线程池耗尽问题的过程。通过查看Dubbo线程状态、分析Jedis连接池获取连接的源码、排查死锁条件等方面,最终确认是因为使用了clusterpipeline模式且没有设置超时时间导致死锁问题。一、背景介绍RedisPipeline是一种高效......
  • 记一次线上华为云Kubernetes(CCE)环境Jenkins 发版爆雷事故
    一、前言2023年10月11号下午17:16分,临近下班之际,研发同事在办公室发出了尖锐的爆鸣声....紧接着企业微信呼唤,说线上项目突然无法正常发版了....与此同时接收到消息,便展开一系列排查。二、排查思路定位从报错信息上来看,在gitpull项目的过程就出错了,提示无法写入新的配置文件.....c......
  • 面试官:ConcurrentHashMap 是如何保证线程安全的
    1、前言阅读此篇文章,你需要有以下知识基础Java内存模型,可见性问题CASHashMap底层原理我们知道,在日常开发中使用的HashMap是线程不安全的,而线程安全类HashTable只是简单的在方法上加锁实现线程安全,效率低下,所以在线程安全的环境下我们通常会使用ConcurrentHashMap,但是又为何需要学习......
  • 一个 hashCode() 函数引发的​「​惨案」
    1、起因让我关注到这一点的起因是一道题:牛客网上的max-points-on-a-line(答题:https://www.nowcoder.com/practice/bfc691e0100441cdb8ec153f32540be2)题目是这么描述的:Givennpointsona2Dplane,findthemaximumnumberofpointsthatlieonthesamestraightline.大意就......
  • 太厉害了,终于有人能把TCP/IP协议讲的明明白白了
    一图看完本文1、计算机网络体系结构分层计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP与OSI在分层模块上稍有区别。OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。2、TCP/IP基础1.TCP/IP的具体含......
  • SpringBoot + SpringBatch + Quartz整合定时批量任务
    1、引言最近一周,被借调到其他部门,赶一个紧急需求,需求内容如下:PC网页触发一条设备升级记录(下图),后台要定时批量设备更新。这里定时要用到Quartz,批量数据处理要用到SpringBatch,二者结合,可以完成该需求。由于之前,没有用过SpringBatch,于是上网查了下资料,发现可参考的不是很多,于是只能去......