目前,我有以下il代码:
var method = new DynamicMethod( "", typeof( object ), new Type[ 0 ] );
var emiter = method.GetILGenerator();
var expando = emiter.DeclareLocal( typeof( ExpandoObject ) );
emiter.Emit( OpCodes.Newobj, typeof( ExpandoObject ).GetConstructors()[ 0 ] );
emiter.Emit( OpCodes.Stloc, expando );
var value = emiter.DeclareLocal( typeof( int ) );
emiter.Emit( OpCodes.Ldc_I4_1 );
emiter.Emit( OpCodes.Stloc, value );
emiter.Emit( OpCodes.Ldloc, expando );
emiter.Emit( OpCodes.Ldnull );
emiter.Emit( OpCodes.Ldc_I4, -1 );
emiter.Emit( OpCodes.Ldloc, value );
if ( value.LocalType.IsValueType )
emiter.Emit( OpCodes.Box, value.LocalType );
else
{
emiter.Emit( OpCodes.Castclass, typeof( object ) );
}
emiter.Emit( OpCodes.Ldstr, "Test" );
emiter.Emit( OpCodes.Ldc_I4_0 );
emiter.Emit( OpCodes.Ldc_I4_1 );
emiter.Emit( OpCodes.Call, typeof( ExpandoObject ).GetMethod( "TrySetValue", BindingFlags.Instance | BindingFlags.NonPublic ) );
emiter.Emit( OpCodes.Ldloc, expando );
emiter.Emit( OpCodes.Ret );
var @delegate = (Func<dynamic>)method.CreateDelegate( typeof( Func<dynamic> ) );
var result = @delegate().Test;当我最初用sigil编写它时,它工作得很好,但是现在我将它转换为DynamicMethod,我得到了这个错误。我准确地复制了Sigil代码,并进行了三次检查。有人事先有什么想法吗谢谢。
方法“DynamicClass.()”试图访问方法DynamicClass Int32、System.Object、System.String、布尔值、布尔值)失败。
发布于 2014-03-06 16:44:02
我通过将restrictedSkipVisibility添加到DynamicMethod构造函数来修正这个问题。
var method = new DynamicMethod( "", typeof( object ), new Type[ 0 ], true );
var emiter = method.GetILGenerator();
var expando = emiter.DeclareLocal( typeof( ExpandoObject ) );
emiter.Emit( OpCodes.Newobj, typeof( ExpandoObject ).GetConstructors()[ 0 ] );
emiter.Emit( OpCodes.Stloc, expando );
var value = emiter.DeclareLocal( typeof( int ) );
emiter.Emit( OpCodes.Ldc_I4_1 );
emiter.Emit( OpCodes.Stloc, value );
emiter.Emit( OpCodes.Ldloc, expando );
emiter.Emit( OpCodes.Ldnull );
emiter.Emit( OpCodes.Ldc_I4, -1 );
emiter.Emit( OpCodes.Ldloc, value );
if ( value.LocalType.IsValueType )
emiter.Emit( OpCodes.Box, value.LocalType );
else
{
emiter.Emit( OpCodes.Castclass, typeof( object ) );
}
emiter.Emit( OpCodes.Ldstr, "Test" );
emiter.Emit( OpCodes.Ldc_I4_0 );
emiter.Emit( OpCodes.Ldc_I4_1 );
emiter.Emit( OpCodes.Call, typeof( ExpandoObject ).GetMethod( "TrySetValue", BindingFlags.Instance | BindingFlags.NonPublic ) );
emiter.Emit( OpCodes.Ldloc, expando );
emiter.Emit( OpCodes.Ret );
var @delegate = (Func<dynamic>)method.CreateDelegate( typeof( Func<dynamic> ) );
var result = @delegate().Test;https://stackoverflow.com/questions/22228343
复制相似问题