1

我想将我的代码从文件直接编译到内存中(Runtime-CompilationRunPE 方法)。

这是我使用的代码:

var param = new CompilerParameters
        {
            GenerateExecutable = false,
            IncludeDebugInformation = false,
            GenerateInMemory = true
        };
        param.ReferencedAssemblies.Add("System.dll");
        param.ReferencedAssemblies.Add("System.Xml.dll");
        param.ReferencedAssemblies.Add("System.Data.dll");
        param.ReferencedAssemblies.Add("System.Core.dll");
        param.ReferencedAssemblies.Add("System.Xml.Linq.dll");

        var codeProvider = new CSharpCodeProvider();
        // The file contaning the codes is here
        var results = codeProvider
            .CompileAssemblyFromFile(param, @"C:\Users\xxx\Desktop\code.txt");

        if (results.Errors.HasErrors)
        {
            foreach (var error in results.Errors)
            {
                Console.WriteLine(error);
            }
        }
        else
        {
            results.CompiledAssembly.CreateInstance("Program");
        }

这将使我在调试中没有错误,但也无法正常工作。只是在调试输出时我看到了这个:

加载“3kp0asrw”。模块是在没有符号的情况下构建的。

其他的看起来还不错。

这是code.txt文件中的代码,假设只需编写 3 行文本并在控制台中显示一条消息:

internal class Program
{
    private static void Main(string[] args)
    {
        string[] lines = { "First line", "Second line", "Third line" };
        System.IO.File.WriteAllLines(@"C:\Users\xxx\Desktop\writeHere.txt", lines);
        Console.WriteLine("Some Random Text!");
    }
}

问题:我在这里缺少什么?您是否知道直接在内存中从文件或源代码运行代码的任何其他方法(AKA RunPE 方法)?你能给我一个简单的例子吗?

注意:我想为更大的代码执行此操作并将其自动化以供以后使用,就像 .net crypters 在存根文件中所做的那样,无需每次都指定类名和...。可能吗?

4

1 回答 1

3

我最近做了同样的事情,您可以根据您的要求更新以下内容,

string[] code = {
                                "using System; using System.Data"+
                                "namespace CodeFromFile"+
                                "{"+
                                "   public class CodeFromFile"+
                                "   {"+
                                "       static public int Add(int a ,int b)"+
                                "       {"+
                                "           return a+b;
                                "       }"+
                                "   }"+
                                "}"
                                    };

并将此代码传递给

static int CompileAndRun(string[] code)
    {

        CompilerParameters CompilerParams = new CompilerParameters();
        string outputDirectory = Directory.GetCurrentDirectory();

        CompilerParams.GenerateInMemory = true;
        CompilerParams.TreatWarningsAsErrors = false;
        CompilerParams.GenerateExecutable = false;
        CompilerParams.CompilerOptions = "/optimize";

        string[] references = { "System.dll", "System.Data.dll" };
        CompilerParams.ReferencedAssemblies.AddRange(references);

        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code);

        if (compile.Errors.HasErrors)
        {
            string text = "Compile error: ";
            foreach (CompilerError ce in compile.Errors)
            {
                text += "rn" + ce.ToString();
            }
            throw new Exception(text);
        }

        Module module = compile.CompiledAssembly.GetModules()[0];
        Type mt = null;
        MethodInfo methInfo = null;

        if (module != null)
        {
            mt = module.GetType("CodeFromFile.CodeFromFile");
        }

        if (mt != null)
        {
            methInfo = mt.GetMethod("Add");
        }

        if (methInfo != null)
        {                
            return (int)methInfo.Invoke(null, new object[] { 5,10});
        }

        return null;
    }

来源:在运行时编译和运行代码以及动态编译 C#

于 2018-01-08T11:24:38.500 回答