在 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