【发布时间】:2018-01-08 11:00:52
【问题描述】:
我想将我的代码从文件直接编译到内存中(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!");
}
}
问题:我在这里缺少什么?您是否知道直接在内存中从文件或源代码运行代码的任何其他方法(AKA RunPE 方法)?能给我举个简单的例子吗?
注意:我想为更大的代码执行此操作并将其自动化以供以后使用,就像 .net 加密器在存根文件中所做的那样,无需每次都指定类名和... .有可能吗?
【问题讨论】:
-
我的猜测是编译和运行在这里是两个独立的东西。我不熟悉 API,但我会检查编译和运行代码的完整示例。
标签: c# memory compilation runtime-compilation