我想将我的代码从文件直接编译到内存中( 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");
}
这将使我在debugg中没有错误但不能正常工作。只是在调试输出我看到这个:
已加载' 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在存根文件中执行的操作,无需每次都指定类名和... 。有可能吗?
答案 0 :(得分: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 runtime和Dynamically Compiling C#