2012-03-13 52 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