コード例 #1
0
ファイル: CcwGenerator.cs プロジェクト: yvt/ngspades
        TypeInfo CreateCcwClass(InterfaceInfo interfaceInfo)
        {
            var typeBuilder = moduleBuilder.DefineType(interfaceInfo.Type.FullName + "<CCW>",
                                                       TypeAttributes.Class | TypeAttributes.Sealed |
                                                       TypeAttributes.NotPublic);

            DefineCcwClass(interfaceInfo, typeBuilder);
            return(typeBuilder.CreateTypeInfo());
        }
コード例 #2
0
ファイル: RcwGenerator.cs プロジェクト: yvt/ngspades
        static void DefineRcwClass(InterfaceInfo interfaceInfo, TypeBuilder typeBuilder)
        {
            var type = typeBuilder;

            var nativeObjectType     = typeof(INativeObject <>).GetTypeInfo().MakeGenericType(type);
            var nativeObjectTypeInfo = nativeObjectType.GetTypeInfo();

            typeBuilder.AddInterfaceImplementation(nativeObjectType);

            foreach (var theInterface in interfaceInfo.AllImplementedInterfaces)
            {
                typeBuilder.AddInterfaceImplementation(theInterface);
            }

            FieldInfo interfacePtrField = typeBuilder.DefineField("interfacePtr", typeof(IntPtr), 0);
            FieldInfo unknownPtrField   = typeBuilder.DefineField("iUnknownPtr", typeof(IntPtr), 0);

            // generate constructor
            var ctor = CreateRcwConstructor(typeBuilder, interfacePtrField, unknownPtrField);

            // generate finalizer
            CreateRcwFinalizer(typeBuilder);

            // generate factory
            CreateRcwFactoryMethod(typeBuilder, ctor);

            var methodNameUniqifier = new Utils.UniqueNameGenerator();

            methodNameUniqifier.Uniquify("interfacePtr");
            methodNameUniqifier.Uniquify("iUnknownPtr");
            methodNameUniqifier.Uniquify("Finalize");
            methodNameUniqifier.Uniquify("Create");
            foreach (var method in interfaceInfo.ComMethodInfos)
            {
                CreateRcwMethod(method, typeBuilder, interfacePtrField, methodNameUniqifier);
            }

            // implement INativeObject
            ImplementFieldGetter(typeBuilder, interfacePtrField,
                                 nativeInterfacePtrProp, TypeBuilder.GetMethod(nativeObjectType, nativeInterfacePtrProp.GetMethod),
                                 methodNameUniqifier);
            ImplementFieldGetter(typeBuilder, unknownPtrField,
                                 nativeIUnknownPtrProp, TypeBuilder.GetMethod(nativeObjectType, nativeIUnknownPtrProp.GetMethod),
                                 methodNameUniqifier);
            ImplementInterfaceProperty(typeBuilder,
                                       interfaceProp, TypeBuilder.GetMethod(nativeObjectType, interfaceProp.GetMethod),
                                       methodNameUniqifier);
        }
コード例 #3
0
ファイル: CcwGenerator.cs プロジェクト: yvt/ngspades
        static void DefineCcwClass(InterfaceInfo interfaceInfo, TypeBuilder typeBuilder)
        {
            var type = typeBuilder;

            var uniqifier = new Utils.UniqueNameGenerator();

            uniqifier.Uniquify("Create"); // reserve

            var methods = new List <CcwMethodInfo>();

            foreach (var method in interfaceInfo.ComMethodInfos)
            {
                methods.Add(CreateCcwMethod(method, typeBuilder, uniqifier));
            }

            CreateCcwFactoryMethod(typeBuilder, methods.ToArray(), uniqifier);
        }