C # dynamic + System.Reflection.Emit = не смешивать? - PullRequest
3 голосов
/ 13 марта 2012

Почему код такой:

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 отлично работают. Есть идеи?

1 Ответ

9 голосов
/ 13 марта 2012

dynamic не разрешает элементы внутренних типов из разных сборок.
(так же, как компилятор не будет)

Сделать тип общедоступным.

...