Ejemplo n.º 1
0
        private static object CreateUnavailableImplementation(Type interfaceType, string dynamicTypeName)
        {
            object unavailableImpl;
            // Defines a public sealed class that only implements typeInterface
            // and for which all methods throw ServiceNotAvailableException.
            TypeBuilder typeBuilderNotAvailable = _moduleBuilder.DefineType(
                dynamicTypeName,
                TypeAttributes.Class | TypeAttributes.Sealed,
                typeof(object),
                new Type[] { interfaceType });

            MethodInfo      mGetTypeFromHandle     = typeof(Type).GetMethod("GetTypeFromHandle");
            ConstructorInfo cNotAvailableException = typeof(ServiceNotAvailableException).GetConstructor(new[] { typeof(Type) });

            foreach (MethodInfo m in ReflectionHelper.GetFlattenMethods(interfaceType))
            {
                Type[]        parameters;
                MethodBuilder mB = ProxyGenerator.CreateInterfaceMethodBuilder(typeBuilderNotAvailable, m, out parameters);
                ILGenerator   g  = mB.GetILGenerator();
                g.Emit(OpCodes.Ldtoken, interfaceType);
                g.EmitCall(OpCodes.Call, mGetTypeFromHandle, null);
                g.Emit(OpCodes.Newobj, cNotAvailableException);
                g.Emit(OpCodes.Throw);
            }
            Type unavailableType = typeBuilderNotAvailable.CreateType();

            unavailableImpl = Activator.CreateInstance(unavailableType);
            return(unavailableImpl);
        }