2011-06-05 20 views
0

我寫了一篇以瞭解對象的構造和IL方法調用遺憾的是它不打印構造對象和調用方法使用IL

下面的程序你是如何在控制檯上做

你有什麼想法嗎?

peverify的輸出也在下面給出。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection.Emit; 
using System.Reflection; 
using System.IO; 

namespace Research 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      AssemblyName name = 
       new AssemblyName(Path.GetFileNameWithoutExtension("Hello")); 
      AssemblyBuilder asmb = 
       System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, 
                AssemblyBuilderAccess.Save); 
      ModuleBuilder modb = asmb.DefineDynamicModule("Hello"); 
      TypeBuilder typeBuilder = modb.DefineType("Bar"); 
      MethodBuilder methb = 
       typeBuilder.DefineMethod("Me", MethodAttributes.Static, 
              typeof(void), System.Type.EmptyTypes); 
      ILGenerator gen = methb.GetILGenerator(); 

      ConstructorInfo cil = typeof(Research.Dog).GetConstructor(new Type[] { }); 
      gen.Emit(OpCodes.Newobj, cil); 
      gen.Emit(OpCodes.Call, typeof(Research.Dog).GetMethod("Bark")); 
      gen.Emit(OpCodes.Ret); 
     } 
    } 
    public class Dog 
    { 
     public void Bark() 
     { 
      Console.WriteLine("How are you doing"); 
     } 
    } 
} 

C:\ TEMP \研究\研究\ BIN \推出> peverify Research.exe

微軟(R)的.NET Framework PE 驗證。版本4.0.30319.1 版權所有(c)Microsoft Corporation。 保留所有權利。

所有的類和方法在 Research.exe已驗證。

C:\ TEMP \研究\研究\ BIN \發佈>

+0

...是什麼打印在控制檯上? – sisve 2011-06-05 13:45:16

回答

2

您創建一個動態組裝,然後做與它無關。爲什麼要打印任何東西?另外,peverify在這裏不會以任何方式幫助你,因爲你沒有驗證你生成的程序集,而只是驗證正在生成它的程序集。

您也不需要撥打typeBuilder.CreateType(),這是必要的,並且您的程序集未設置爲可以運行。

如果使用AssemblyBuilderAccess.RunAndSave,並在方法的末尾添加以下代碼,它會工作(至少它爲我的作品):

var barType = typeBuilder.CreateType(); 
var meMethod = barType.GetMethod("Me", BindingFlags.Static | BindingFlags.NonPublic); 
meMethod.Invoke(null, null);