[英]Compile c# code from file on memory
我想將文件中的代碼直接編譯到內存中( Runtime-Compilation或RunPE方法 )。
這是我使用的代碼:
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.