2012-03-13 4 views
1

なぜこのようなコード: はのsayHello「の定義が含まれていません 'オブジェクト':C#dynamic + System.Reflection.Emit =混在しないでください。

未処理の例外: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

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(); 
    } 
} 

が例外を生成します'

しかし、reflection API経由の呼び出しは完全に機能します。何か案は?

答えて

5

dynamicは、異なるアセンブリの内部型のメンバーを解決しません。
(コンパイラと同じように)

タイプをパブリックにします。

+0

よろしくお願いします。 – ControlFlow

関連する問題