コード例 #1
0
        //[LoaderOptimization(LoaderOptimization.MultiDomain)]
        public static IntPtr DllGetClassObject(IntPtr prclsid, IntPtr priid, out IntPtr ppv)
        {
            Guid rclsid = (Guid)Marshal.PtrToStructure(prclsid, typeof(Guid));
            Guid riid   = (Guid)Marshal.PtrToStructure(priid, typeof(Guid));

            ppv = IntPtr.Zero;

            try
            {
                ComInfo comInfo = ComInfo.GetComInfoFromClsid(rclsid);

                if (ComHelper.GuidIsIn(riid,
                                       comInfo.ClsId,
                                       ComHelper.IID_IClassFactory,
                                       ComHelper.IID_IUnknown,
                                       ComHelper.IID_IDispatch,
                                       ComHelper.IID_IOleObject))
                {
                    Type type = typeof(Classes.ComClassFactory);

                    //Pass a memory address to write to so we can marshal the COM interface.
                    IntPtr hComObjAddress = Marshal.AllocHGlobal(IntPtr.Size);

                    _ClassFactoryInstance = NewAppDomain(comInfo).CreateInstanceFromAndUnwrap(
                        type.Assembly.Location,      //Changed from type.Assembly.FullName - specify path instead of class name
                        type.FullName,
                        true,
                        BindingFlags.Default,
                        null,
                        new object[] { rclsid, hComObjAddress },
                        null,
                        null);


                    IntPtr comMarshalDirect = Marshal.GetComInterfaceForObject(_ClassFactoryInstance, typeof(IClassFactory));
                    IntPtr comObjectAddr    = Marshal.ReadIntPtr(hComObjAddress);

                    //Call to DllClassObject is requesting IClassFactory.
                    ppv = comObjectAddr;

                    Marshal.FreeHGlobal(hComObjAddress);

                    return(IntPtr.Zero); //S_OK
                }
                else
                {
                    return(new IntPtr(ComHelper.E_NOINTERFACE)); //CLASS_E_CLASSNOTAVAILABLE
                }
            }
            catch
            {
                return(new IntPtr(ComHelper.E_NOINTERFACE)); //CLASS_E_CLASSNOTAVAILABLE
            }
        }