【发布时间】:2019-05-29 03:30:03
【问题描述】:
我想获取动态编译代码的标准输出。
我的代码:
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var source = File.ReadAllText("form.cs");
Dictionary<string, string> providerOptions = new Dictionary<string, string>
{
{"CompilerVersion", "v4.0"}
};
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
CompilerParameters compilerParams = new CompilerParameters
{
GenerateInMemory = true,
GenerateExecutable = false,
ReferencedAssemblies = {"System.dll" ,"mscorlib.dll"}
};
CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
Assembly assembly = results.CompiledAssembly;
Type program = assembly.GetType("program.TestPerson");
MethodInfo main = program.GetMethod("Main");
var outp= main.Invoke(null, null);
//Console.WriteLine(outp);
Console.ReadLine();
}
}
}
form.cs的内容:
using System;
namespace program {
public class TestPerson
{
public static void Main()
{
var person1 = new Person();
Console.WriteLine(person1.Name);
}
}
}
public class Person
{
public Person()
{
Name = "unknown";
}
public Person(string name)
{
Name = name;
}
public string Name { get;set; }
public override string ToString()
{
return Name;
}
}
我真正想要的是在父应用程序中的变量中编译后将 form.cs (Console.WriteLine) 的标准输出,顺便说一下,我不想将代码构建到文件中并将其作为进程运行并读取其输出。 还假设 form.cs 的内容不可编辑。
【问题讨论】:
-
您想获得 IL 输出吗?或者您想从您的应用程序中捕获您要调用的
Console.WriteLine? -
我可能是错的,但看起来你很困惑。生成的代码不是一个独立的进程,它将作为您当前正在运行的进程的一部分运行,因此它不会有自己的
stdout。 -
@Icepickle,我想在 form.cs 中捕获 Console.WriteLine 输出
-
@ZorgoZ,是的,我知道,我想你没有得到我的问题,我想做的是动态编译内存中的一段代码,并在不构建的情况下将其输出到变量中任何文件。更具体地说,假设我要编译的代码是一个独立的命令行应用程序,它具有 main() 函数,并将输出写入控制台。但我想在内存中编译它并在变量中获取它在控制台中写入的内容。
-
setting the out 能帮到你吗?