/// <summary>
        /// Gets the generator information.
        /// </summary>
        /// <param name="progId">prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId]</param>
        /// <param name="generatesDesignTimeSource">GeneratesDesignTimeSource key value</param>
        /// <param name="generatesSharedDesignTimeSource">GeneratesSharedDesignTimeSource key value</param>
        /// <param name="useTempPEFlag">UseDesignTimeCompilationFlag key value</param>
        /// <param name="guiddGenerator">CLSID key value</param>
        /// <returns>S_OK if succesful</returns>
        public virtual int GetGeneratorInformation(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out Guid guidGenerator)
        {
            RegistryKey genKey;

            generatesDesignTimeSource       = -1;
            generatesSharedDesignTimeSource = -1;
            useTempPEFlag = -1;
            guidGenerator = Guid.Empty;
            if (String.IsNullOrEmpty(progId))
            {
                return(VSConstants.S_FALSE);
            }

            //Create the single file generator and pass it out.
            if (!this.generatorsMap.ContainsKey(progId))
            {
                // We have to check whether the BaseGeneratorkey returns null.
                RegistryKey tempBaseGeneratorKey = this.BaseGeneratorsKey;
                if (tempBaseGeneratorKey == null || (genKey = tempBaseGeneratorKey.OpenSubKey(progId)) == null)
                {
                    return(VSConstants.S_FALSE);
                }

                //Get the CLSID
                string guid = (string)genKey.GetValue(GeneratorClsid, "");
                if (String.IsNullOrEmpty(guid))
                {
                    return(VSConstants.S_FALSE);
                }

                GeneratorMetaData genData = new GeneratorMetaData();

                genData.GeneratorClsid = guidGenerator = new Guid(guid);
                //Get the GeneratesDesignTimeSource flag. Assume 0 if not present.
                genData.GeneratesDesignTimeSource = generatesDesignTimeSource = (int)genKey.GetValue(this.GeneratesDesignTimeSource, 0);
                //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present.
                genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource = (int)genKey.GetValue(GeneratesSharedDesignTimeSource, 0);
                //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present.
                genData.UseDesignTimeCompilationFlag = useTempPEFlag = (int)genKey.GetValue(UseDesignTimeCompilationFlag, 0);
                this.generatorsMap.Add(progId, genData);
            }
            else
            {
                GeneratorMetaData genData = this.generatorsMap[progId];
                generatesDesignTimeSource = genData.GeneratesDesignTimeSource;
                //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present.
                generatesSharedDesignTimeSource = genData.GeneratesSharedDesignTimeSource;
                //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present.
                useTempPEFlag = genData.UseDesignTimeCompilationFlag;
                //Get the CLSID
                guidGenerator = genData.GeneratorClsid;
            }

            return(VSConstants.S_OK);
        }
Example #2
0
        /// <summary>
        /// Creates an instance of the single file generator requested
        /// </summary>
        /// <param name="progId">prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId]</param>
        /// <param name="generatesDesignTimeSource">GeneratesDesignTimeSource key value</param>
        /// <param name="generatesSharedDesignTimeSource">GeneratesSharedDesignTimeSource key value</param>
        /// <param name="useTempPEFlag">UseDesignTimeCompilationFlag key value</param>
        /// <param name="generate">IVsSingleFileGenerator interface</param>
        /// <returns>S_OK if succesful</returns>
        public virtual int CreateGeneratorInstance(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out IVsSingleFileGenerator generate)
        {
            Guid genGuid;

            ThreadHelper.ThrowIfNotOnUIThread();

            ErrorHandler.ThrowOnFailure(this.GetGeneratorInformation(progId, out generatesDesignTimeSource, out generatesSharedDesignTimeSource, out useTempPEFlag, out genGuid));

            //Create the single file generator and pass it out. Check to see if it is in the cache
            if (genGuid.CompareTo(Guid.Empty) == 0)
            {
                generate = null;
                return(VSConstants.S_FALSE);
            }
            if (!this.generatorsMap.ContainsKey(progId) || ((this.generatorsMap[progId]).Generator == null))
            {
                Guid   riid        = VSConstants.IID_IUnknown;
                uint   dwClsCtx    = (uint)CLSCTX.CLSCTX_INPROC_SERVER;
                IntPtr genIUnknown = IntPtr.Zero;
                //create a new one.
                ErrorHandler.ThrowOnFailure(this.LocalRegistry.CreateInstance(genGuid, null, ref riid, dwClsCtx, out genIUnknown));
                if (genIUnknown != IntPtr.Zero)
                {
                    try
                    {
                        object generator = Marshal.GetObjectForIUnknown(genIUnknown);
                        //Build the generator meta data object and cache it.
                        GeneratorMetaData genData = new GeneratorMetaData();
                        genData.GeneratesDesignTimeSource       = generatesDesignTimeSource;
                        genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource;
                        genData.UseDesignTimeCompilationFlag    = useTempPEFlag;
                        genData.GeneratorClsid     = genGuid;
                        genData.Generator          = generator;
                        this.generatorsMap[progId] = genData;
                    }
                    finally
                    {
                        Marshal.Release(genIUnknown);
                    }
                }
            }

            generate = (this.generatorsMap[progId]).Generator as IVsSingleFileGenerator;

            return(VSConstants.S_OK);
        }
        /// <summary>
        /// Gets the generator information.
        /// </summary>
        /// <param name="progId">prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId]</param>
        /// <param name="generatesDesignTimeSource">GeneratesDesignTimeSource key value</param>
        /// <param name="generatesSharedDesignTimeSource">GeneratesSharedDesignTimeSource key value</param>
        /// <param name="useTempPEFlag">UseDesignTimeCompilationFlag key value</param>
        /// <param name="guiddGenerator">CLSID key value</param>
        /// <returns>S_OK if succesful</returns>
        public virtual int GetGeneratorInformation(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out Guid guidGenerator)
        {
            RegistryKey genKey;
            generatesDesignTimeSource = -1;
            generatesSharedDesignTimeSource = -1;
            useTempPEFlag = -1;
            guidGenerator = Guid.Empty;
            if(string.IsNullOrEmpty(progId))
                return VSConstants.S_FALSE;

            //Create the single file generator and pass it out.
            if(!this.generatorsMap.ContainsKey(progId))
            {
                // We have to check whether the BaseGeneratorkey returns null.
                RegistryKey tempBaseGeneratorKey = this.BaseGeneratorsKey;
                if(tempBaseGeneratorKey == null || (genKey = tempBaseGeneratorKey.OpenSubKey(progId)) == null)
                {
                    return VSConstants.S_FALSE;
                }

                //Get the CLSID
                string guid = (string)genKey.GetValue(GeneratorClsid, "");
                if(string.IsNullOrEmpty(guid))
                    return VSConstants.S_FALSE;

                GeneratorMetaData genData = new GeneratorMetaData();

                genData.GeneratorClsid = guidGenerator = new Guid(guid);
                //Get the GeneratesDesignTimeSource flag. Assume 0 if not present.
                genData.GeneratesDesignTimeSource = generatesDesignTimeSource = (int)genKey.GetValue(this.GeneratesDesignTimeSource, 0);
                //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present.
                genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource = (int)genKey.GetValue(GeneratesSharedDesignTimeSource, 0);
                //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present.
                genData.UseDesignTimeCompilationFlag = useTempPEFlag = (int)genKey.GetValue(UseDesignTimeCompilationFlag, 0);
                this.generatorsMap.Add(progId, genData);
            }
            else
            {
                GeneratorMetaData genData = this.generatorsMap[progId];
                generatesDesignTimeSource = genData.GeneratesDesignTimeSource;
                //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present.
                generatesSharedDesignTimeSource = genData.GeneratesSharedDesignTimeSource;
                //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present.
                useTempPEFlag = genData.UseDesignTimeCompilationFlag;
                //Get the CLSID
                guidGenerator = genData.GeneratorClsid;
            }

            return VSConstants.S_OK;
        }
        /// <summary>
        /// Creates an instance of the single file generator requested
        /// </summary>
        /// <param name="progId">prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId]</param>
        /// <param name="generatesDesignTimeSource">GeneratesDesignTimeSource key value</param>
        /// <param name="generatesSharedDesignTimeSource">GeneratesSharedDesignTimeSource key value</param>
        /// <param name="useTempPEFlag">UseDesignTimeCompilationFlag key value</param>
        /// <param name="generate">IVsSingleFileGenerator interface</param>
        /// <returns>S_OK if succesful</returns>
        public virtual int CreateGeneratorInstance(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out IVsSingleFileGenerator generate)
        {
            Guid genGuid;
            ErrorHandler.ThrowOnFailure(this.GetGeneratorInformation(progId, out generatesDesignTimeSource, out generatesSharedDesignTimeSource, out useTempPEFlag, out genGuid));

            //Create the single file generator and pass it out. Check to see if it is in the cache
            if(!this.generatorsMap.ContainsKey(progId) || ((this.generatorsMap[progId]).Generator == null))
            {
                Guid riid = VSConstants.IID_IUnknown;
                uint dwClsCtx = (uint)CLSCTX.CLSCTX_INPROC_SERVER;
                IntPtr genIUnknown = IntPtr.Zero;
                //create a new one.
                ErrorHandler.ThrowOnFailure(this.LocalRegistry.CreateInstance(genGuid, null, ref riid, dwClsCtx, out genIUnknown));
                if(genIUnknown != IntPtr.Zero)
                {
                    try
                    {
                        object generator = Marshal.GetObjectForIUnknown(genIUnknown);
                        //Build the generator meta data object and cache it.
                        GeneratorMetaData genData = new GeneratorMetaData();
                        genData.GeneratesDesignTimeSource = generatesDesignTimeSource;
                        genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource;
                        genData.UseDesignTimeCompilationFlag = useTempPEFlag;
                        genData.GeneratorClsid = genGuid;
                        genData.Generator = generator;
                        this.generatorsMap[progId] = genData;
                    }
                    finally
                    {
                        Marshal.Release(genIUnknown);
                    }
                }
            }

            generate = (this.generatorsMap[progId]).Generator as IVsSingleFileGenerator;

            return VSConstants.S_OK;
        }