2011-10-02 37 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程序集。