【问题标题】:Compile c# code from file on memory从内存中的文件编译 c# 代码
【发布时间】:2018-01-08 11:00:52
【问题描述】:

我想将我的代码从文件直接编译到内存中(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 加密器在存根文件中所做的那样,无需每次都指定类名和... .有可能吗?

【问题讨论】:

  • 我的猜测是编译和运行在这里是两个独立的东西。我不熟悉 API,但我会检查编译和运行代码的完整示例。

标签: c# memory compilation runtime-compilation


【解决方案1】:

我最近也是这样,你可以根据你的要求更新以下,

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;
    }

来源:Compiling and Running code at runtimeDynamically Compiling C#

【讨论】:

  • 试过这个并使用您的示例,但这不适用于更大的代码。可以 ?我将我的代码从文件存储到 string[] 但无法使用,认为它需要进行大量调整。
  • 是否抛出异常?
  • if (compile.Errors.HasErrors) { string text = "Compile error: "; foreach (CompilerError ce in compile.Errors) { text += "rn" + ce.ToString(); } throw new Exception(text); } 放置一个断点,这将确认写入文件的代码是否编译成功。
  • 没有错误或异常,你可以为文件做吗?我将 CompileAssemblyFromSource 更改为 CompileAssemblyFromFile 并进一步更改,但再次没有错误,也不会发生任何事情。
  • 我认为问题在于您从文件中读取的代码。如果您可以尝试从文件中执行工作示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多