C#动态+System.Reflection.Emit=不要混合

本文关键字:混合 Emit 动态 +System Reflection | 更新日期: 2023-09-27 18:27:44

为什么代码是这样的:

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进行的调用完全有效。有什么想法吗?

C#动态+System.Reflection.Emit=不要混合

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

将类型公开。