0

我想在我的应用程序中编译一个 C# 控制台应用程序并以某种方式获得返回的结果。我希望这种情况无声地发生(我不希望控制台实际显示等)假设我有这段代码

private Assembly BuildAssembly(string code)
{
    Microsoft.CSharp.CSharpCodeProvider provider = 
       new CSharpCodeProvider();
    ICodeCompiler compiler = provider.CreateCompiler();
    CompilerParameters compilerparams = new CompilerParameters();
    compilerparams.GenerateExecutable = false;
    compilerparams.GenerateInMemory = true;
    CompilerResults results = 
       compiler.CompileAssemblyFromSource(compilerparams, code);
    if (results.Errors.HasErrors)
    {
        StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
        foreach (CompilerError error in results.Errors )
        {
            errors.AppendFormat("Line {0},{1}\t: {2}\n", 
                   error.Line, error.Column, error.ErrorText);
        }
        throw new Exception(errors.ToString());
    }
    else
    {
        return results.CompiledAssembly;
    }
}

我将如何执行程序集并获得结果?

4

1 回答 1

3

这是我发现的东西-

public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args)
{
    var asm = BuildAssembly(code);
    object instance = null;
    Type type;
    if(isstatic)
    {
        type = asm.GetType(namespacename + "." + classname);
    }
    else
    {
        instance = asm.CreateInstance(namespacename + "." + classname);
        type = instance.GetType();
    }
    return type.GetMethod(functionname).Invoke(instance, args);
}

此方法只是扩展了您的 BuildAssembly 函数。

资源

于 2013-06-23T20:20:02.947 回答