2011-10-02 35 views
2

我想在C#.NET中进行一种实验。我想创建一个克隆自己的程序(最终作为一个变异克隆)。最后,我想让它产生一个“儿子”,也需要有能力克隆自己等等!自我克隆可执行文件与.NET反射

我想让这样的事情:

static void Main(string[] args) 
     { 

      string Son_Name = "son"; 
      string Full_Son_Name = Son_Name + ".exe"; 
      AssemblyName aName = new AssemblyName(Son_Name); 
      AssemblyBuilder aBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save); 
      ModuleBuilder mBuilder = aBuilder.DefineDynamicModule("Module", Full_Son_Name, false); 
      TypeBuilder tBuilder = mBuilder.DefineType("Program", TypeAttributes.Public); 
      MethodBuilder methodBuilder = tBuilder.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static); 
      ILGenerator ilGenerator = methodBuilder.GetILGenerator(); 
      MethodInfo m_ReadLine = typeof(System.Console).GetMethod("ReadLine", BindingFlags.Public | BindingFlags.Static); 

      Clone_My_Main_method(methodbuilder);//I need something to do THAT 
      aBuilder.SetEntryPoint(methodBuilder); 
      tBuilder.CreateType(); 
      aBuilder.Save(Full_Son_Name); 

因此,与此代码我在运行时进行动态组装succeded,并将其保存为“son.exe”或执行它。现在我需要“建立”该程序集,阅读我的主程序并将其复制到子程序集中。

我开始使用ilgenerator.emit,但我正在进入一个无限的“编程”循环。我认为要制作parent.exe,用ildasm反汇编,翻译ilgenerator.emit操作码中的所有CIL代码,然后用ilgenerator.emit发送所有这些代码。简单地说,我认为这是一项乏味的工作,不能......工作。

事实上,我想在运行时读取我自己的主要方法,然后用一些技巧将它放到动态程序集上。

任何人有任何想法? 谢谢:)

+2

欢迎来到[quines]的精彩世界(http://en.wikipedia.org/wiki/Quine_%28computing%29)! – SLaks

+0

File.Copy()太无聊了吗?然后使用codegolf.stackexchange.com –

回答

1

您应该使用​​,它可以读取和修改.Net程序集。