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

在 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# 命令时,请确保您信任要执行的代码,以防止潜在的安全风险。

posted @ 2023-10-12 12:09  China Soft  阅读(187)  评论(0编辑  收藏  举报