private void PrepareConfigFile()
        {
            // add a temporal file on App_Code folder in case there's no code so we force precompilation and
            // get code analysis for the web.config file
            // Note: this file may be removed after the code analysis process is done.
            Web.VSWebSite webProject = this.project.Object as Web.VSWebSite;
            if (webProject.CodeFolders.Count == 0)
            {
                // add App_Code folder
                webProject.CodeFolders.Add("App_Code\\");
            }
            Web.CodeFolder codeFolder = (Web.CodeFolder)webProject.CodeFolders.Item(1);
            // check if we need to add a temp file
            foreach (ProjectItem item in codeFolder.ProjectItem.ProjectItems)
            {
                string ext = Path.GetExtension(item.Name);
                if (!string.IsNullOrEmpty(ext) &&
                    !ext.Equals(".exclude", StringComparison.OrdinalIgnoreCase))
                {
                    // do not add the temp file since we already have some code file
                    return;
                }
            }

            this.webTempFile = Path.Combine(webProject.Project.FileName,
                                            codeFolder.FolderPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)
                                            + Path.ChangeExtension(Path.GetRandomFileName(), DteHelperEx.GetDefaultExtension(this.project)));

            if (!File.Exists(this.webTempFile))
            {
                File.WriteAllText(this.webTempFile, string.Empty);
            }
        }
 private void SetCodeAnalysisOnReferences(string rulesPath)
 {
     if (!DteHelper2.IsWebProject(this.project))
     {
         Vs.VSProject vsProject = this.project.Object as Vs.VSProject;
         foreach (Vs.Reference reference in vsProject.References)
         {
             if (reference.SourceProject != null)
             {
                 SetCodeAnalysisOnProject(reference.SourceProject, rulesPath);
             }
         }
     }
     else
     {
         Web.VSWebSite webProject = this.project.Object as Web.VSWebSite;
         foreach (Web.AssemblyReference reference in webProject.References)
         {
             Project project = GetSourceProject(reference);
             if (project != null)
             {
                 SetCodeAnalysisOnProject(project, rulesPath);
             }
         }
     }
 }
            private void LoadProjectReferenceTypesFromCurrentProject(Dictionary <string, Type> availableTypes,
                                                                     IServiceProvider provider,
                                                                     Project currentProject)
            {
                List <Project> referencedProjects = new List <Project>();

                if (!DteHelper2.IsWebProject(currentProject))
                {
                    Vs.VSProject vsProject = currentProject.Object as Vs.VSProject;
                    foreach (Vs.Reference reference in vsProject.References)
                    {
                        if (reference.SourceProject != null)
                        {
                            referencedProjects.Add(reference.SourceProject);
                        }
                    }
                }
                else
                {
                    Web.VSWebSite webProject = currentProject.Object as Web.VSWebSite;
                    foreach (Web.AssemblyReference reference in webProject.References)
                    {
                        Project project = GetSourceProject(reference);
                        if (project != null)
                        {
                            referencedProjects.Add(project);;
                        }
                    }
                }

                LoadTypesFromProjects(referencedProjects, availableTypes, provider, currentProject);
            }
        /// <summary>
        /// Adds the project reference to the <see cref="ReferencedProject"/>
        /// </summary>
        public override void Execute()
        {
            if (this.ReferencedProject.UniqueName.Equals(this.ReferringProject.UniqueName, StringComparison.InvariantCultureIgnoreCase))
            {
                // Do nothing.
                return;
            }
            // If reference already exists, nothing happens.
            // If referringProject is a VSProject
            VSProject vsProject = referringProject.Object as VSProject;

            if (vsProject != null)
            {
                if (referencedProject.Kind.Equals(WebProjectKind, StringComparison.InvariantCultureIgnoreCase))
                {
                    VsWebSite.VSWebSite vsWebSite = (VsWebSite.VSWebSite)(referencedProject.Object);
                    foreach (VsWebSite.WebService webService in vsWebSite.WebServices)
                    {
                        vsProject.AddWebReference(webService.URL);
                    }
                }
                else
                {
                    // No error handling needed here. See documentation for AddProject.
                    vsProject.References.AddProject(referencedProject);
                }
            }
            else
            {
                // If the Project recived is not a VsProject
                // Try it with a webProject
                VSWebSite webProject = referringProject.Object as VSWebSite;
                if (webProject != null)
                {
                    if (referencedProject.Kind.Equals(WebProjectKind, StringComparison.InvariantCultureIgnoreCase))
                    {
                        VSWebSite vsWebSite = (VSWebSite)(referencedProject.Object);
                        foreach (VsWebSite.WebService webService in vsWebSite.WebServices)
                        {
                            webProject.WebReferences.Add(webService.URL, webService.ClassName);
                        }
                    }
                    else
                    {
                        // Check if the reference already exists in the WebProject
                        if (!IsAlreadyReferenced(webProject, referencedProject))
                        {
                            webProject.References.AddFromProject(referencedProject);
                        }
                    }
                }
            }
        }