簡體   English   中英

從內存中的文件編譯C#代碼

[英]Compile c# code from file on memory

我想將文件中的代碼直接編譯到內存中( 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!");
    }
}

問題 :我在這里想念什么? 您是否知道其他直接從文件或源代碼在內存中運行代碼的方法(又名RunPE方法)? 能給我舉個簡單的例子嗎?

注意 :我想對更大的代碼執行此操作,並對其進行自動化以供以后使用,例如.net加密程序在存根文件中所做的事情,無需每次都指定類名和...。 可能嗎?

我最近也一樣,您可以根據自己的要求更新以下內容,

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#

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM