Exemplo n.º 1
0
        static DynamicResolver()
        {
            var assembly = typeof(DynamicMethod).Assembly;

            dynamicResolverType    = assembly.GetType("System.Reflection.Emit.DynamicResolver");
            dynamicILInfoType      = assembly.GetType("System.Reflection.Emit.DynamicILInfo");
            dynamicILGeneratorType = assembly.GetType("System.Reflection.Emit.DynamicILGenerator");
            BuildFactoryByDynamicILInfo();
            BuildFactoryByDynamicILGenerator();
            BuildGetCodeInfoDelegate();
            BuildGetRawEHInfoDelegate();
            BuildGetEHInfoDelegate();

            var m_methodField = dynamicResolverType.GetField("m_method", BindingFlags.Instance | BindingFlags.NonPublic);

            if (m_methodField == null)
            {
                throw new InvalidOperationException("Field 'DynamicResolver.m_methodField' is not found");
            }
            m_methodSetter = FieldsExtractor.GetSetter(m_methodField);

            var m_resolverField = typeof(DynamicMethod).GetField("m_resolver", BindingFlags.Instance | BindingFlags.NonPublic);

            if (m_resolverField == null)
            {
                throw new InvalidOperationException("Field 'DynamicResolver.m_resolver' is not found");
            }
            m_resolverSetter = FieldsExtractor.GetSetter <DynamicMethod, object>(m_resolverField);

            var m_localSignatureField = dynamicResolverType.GetField("m_localSignature", BindingFlags.Instance | BindingFlags.NonPublic);

            if (m_localSignatureField == null)
            {
                throw new InvalidOperationException("Field 'DynamicResolver.m_localSignature' is not found");
            }
            m_localSignatureExtractor = FieldsExtractor.GetExtractor <object, byte[]>(m_localSignatureField);
        }
        private static Expression GetSetter(FieldInfo field, Expression obj, Expression newValue)
        {
            var setter = FieldsExtractor.GetSetter(field);

            return(Expression.Invoke(Expression.Constant(setter), obj ?? Expression.Constant(null), Expression.Convert(newValue, typeof(object))));
        }