2012-03-13 32 views
1

爲什麼會出現這樣的代碼:C#dynamic + System.Reflection.Emit =不混合?

using System; 
using System.Reflection; 
using System.Reflection.Emit; 

class Program 
{ 
    static Type CreateDynamicType() 
    { 
    var typeBuilder = AppDomain.CurrentDomain 
     .DefineDynamicAssembly(
     name: new AssemblyName("FooAssembly"), 
     access: AssemblyBuilderAccess.Run) 
     .DefineDynamicModule("FooModule") 
     .DefineType("Foo", TypeAttributes.Class); 

    typeBuilder 
     .DefineDefaultConstructor(MethodAttributes.Public); 

    var method = typeBuilder 
     .DefineMethod("SayHello", MethodAttributes.Public); 

    var il = method.GetILGenerator(); 
    il.EmitWriteLine("Hello!"); 
    il.Emit(OpCodes.Ret); 

    return typeBuilder.CreateType(); 
    } 

    static void Main() 
    { 
    var type = CreateDynamicType(); 
    dynamic instance = Activator.CreateInstance(type); 
    instance.SayHello(); 
    } 
} 

可生產例外:

未處理的異常: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: '對象' 不 不包含「SayHello的定義'

但通過反射API調用完美的作品。有任何想法嗎?

回答

5

dynamic將不解析來自不同程序集的內部類型的成員。
(就像編譯器不會)

使類型爲public。

+0

非常好,謝謝! – ControlFlow 2012-03-13 16:15:35