C#dynamic + System.Reflection.Emit =不要混用?

时间:2012-03-13 16:10:21

标签: c# reflection dynamic 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:'object'可以   不包含'SayHello'的定义

但是通过反射API的调用非常有效。有什么想法吗?

1 个答案:

答案 0 :(得分:9)

dynamic不会解析来自不同程序集的内部类型的成员 (就像编译器不会)

将该类型设为公开。