Esempio n. 1
0
        private static Type CreateDelegateType(BasicSignature signature)
        {
            string delTypeName = signature.UniqueName;

            TypeAttributes typeAttr = TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass;
            TypeBuilder    del      = CppLibrary.interopModule.DefineType(delTypeName, typeAttr, typeof(MulticastDelegate));

            if (signature.CallingConvention.HasValue)
            {
                ConstructorInfo        ufpa             = typeof(UnmanagedFunctionPointerAttribute).GetConstructor(new Type [] { typeof(CallingConvention) });
                CustomAttributeBuilder unmanagedPointer = new CustomAttributeBuilder(ufpa, new object [] { signature.CallingConvention.Value });
                del.SetCustomAttribute(unmanagedPointer);
            }

            MethodAttributes   ctorAttr = MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public;
            ConstructorBuilder ctor     = del.DefineConstructor(ctorAttr, CallingConventions.Standard, new Type[] { typeof(object), typeof(System.IntPtr) });

            ctor.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);

            Type []          parameterTypes = signature.ParameterTypes.ToArray();
            MethodAttributes methodAttr     = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual;

            MethodBuilder invokeMethod = del.DefineMethod("Invoke", methodAttr, signature.ReturnType, parameterTypes);

            invokeMethod.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);

            return(del.CreateType());
        }
Esempio n. 2
0
 public bool IsCompatibleWith(BasicSignature other)
 {
     return(CallingConvention == other.CallingConvention &&
            ((ParameterTypes == null && other.ParameterTypes == null) ||
             ParameterTypes.SequenceEqual(other.ParameterTypes)) &&
            ReturnType.Equals(other.ReturnType));
 }
Esempio n. 3
0
        public static Type GetDelegateType(BasicSignature signature)
        {
            Type delegateType;

            if (type_cache == null)
            {
                type_cache = new Dictionary <BasicSignature, Type> ();
            }

            if (!type_cache.TryGetValue(signature, out delegateType))
            {
                delegateType = CreateDelegateType(signature);
                type_cache.Add(signature, delegateType);
            }

            return(delegateType);
        }