【问题标题】:C# dynamic + System.Reflection.Emit = do not mix?C# 动态 + System.Reflection.Emit = 不混?
【发布时间】:2012-03-30 01:46:19
【问题描述】:

为什么代码是这样的:

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 调用完全可以。有什么想法吗?

【问题讨论】:

    标签: c# reflection dynamic reflection.emit


    【解决方案1】:

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

    公开类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多