/// <summary> /// Add a PropertyGroup to the project for a particular Asp.Net configuration. This PropertyGroup /// will have the correct values for all the Asp.Net properties for this project and this configuration. /// </summary> /// <param name="msbuildProject"></param> /// <param name="proj"></param> /// <param name="configurationName"></param> /// <param name="aspNetCompilerParameters"></param> /// <param name="solutionFile"></param> /// <owner>RGoel</owner> static private void AddPropertyGroupForAspNetConfiguration ( Project msbuildProject, ProjectInSolution proj, string configurationName, AspNetCompilerParameters aspNetCompilerParameters, string solutionFile ) { // Add a new PropertyGroup that is condition'd on the Configuration. BuildPropertyGroup newPropertyGroup = msbuildProject.AddNewPropertyGroup(false /* insertAtEndOfProject = false */); newPropertyGroup.Condition = String.Format(CultureInfo.InvariantCulture, " '$(AspNetConfiguration)' == '{0}' ", EscapingUtilities.Escape(configurationName)); // Add properties into the property group for each of the AspNetCompiler properties. newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetVirtualPath"), aspNetCompilerParameters.aspNetVirtualPath, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetPhysicalPath"), aspNetCompilerParameters.aspNetPhysicalPath, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetTargetPath"), aspNetCompilerParameters.aspNetTargetPath, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetForce"), aspNetCompilerParameters.aspNetForce, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetUpdateable"), aspNetCompilerParameters.aspNetUpdateable, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetDebug"), aspNetCompilerParameters.aspNetDebug, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetKeyFile"), aspNetCompilerParameters.aspNetKeyFile, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetKeyContainer"), aspNetCompilerParameters.aspNetKeyContainer, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetDelaySign"), aspNetCompilerParameters.aspNetDelaySign, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetAPTCA"), aspNetCompilerParameters.aspNetAPTCA, true); newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetFixedNames"), aspNetCompilerParameters.aspNetFixedNames, true); string aspNetPhysicalPath = aspNetCompilerParameters.aspNetPhysicalPath; if (!String.IsNullOrEmpty(aspNetPhysicalPath)) { // Trim the trailing slash if one exists. if ( (aspNetPhysicalPath[aspNetPhysicalPath.Length - 1] == Path.AltDirectorySeparatorChar) || (aspNetPhysicalPath[aspNetPhysicalPath.Length - 1] == Path.DirectorySeparatorChar) ) { aspNetPhysicalPath = aspNetPhysicalPath.Substring(0, aspNetPhysicalPath.Length - 1); } // This gets us the last folder in the physical path. string lastFolderInPhysicalPath = null; try { lastFolderInPhysicalPath = Path.GetFileName(aspNetPhysicalPath); } catch (Exception e) { if (ExceptionHandling.NotExpectedException(e)) throw; ProjectFileErrorUtilities.VerifyThrowInvalidProjectFile(false, "SubCategoryForSolutionParsingErrors", new BuildEventFileInfo(solutionFile), "SolutionParseInvalidProjectFileName", proj.RelativePath, e.Message); } if (!String.IsNullOrEmpty(lastFolderInPhysicalPath)) { // If there is a global property called "OutDir" set, that means the caller is trying to // override the AspNetTargetPath. What we want to do in this case is concatenate: // $(OutDir) + "\_PublishedWebsites" + (the last portion of the folder in the AspNetPhysicalPath). BuildProperty targetPathOverrideProperty = newPropertyGroup.AddNewProperty(GenerateSafePropertyName(proj, "AspNetTargetPath"), @"$(OutDir)" + EscapingUtilities.Escape(webProjectOverrideFolder) + Path.DirectorySeparatorChar + EscapingUtilities.Escape(lastFolderInPhysicalPath) + Path.DirectorySeparatorChar); targetPathOverrideProperty.Condition = " '$(OutDir)' != '' "; } } }
/// <summary> /// Takes a property name / value that comes from the SLN file for a Venus project, and /// stores it appropriately in our data structures. /// </summary> /// <param name="proj"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <owner>RGoel</owner> private void ParseAspNetCompilerProperty ( ProjectInSolution proj, string propertyName, string propertyValue ) { // What we expect to find in the SLN file is something that looks like this: // // Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "c:\...\myfirstwebsite\", "..\..\..\..\..\..\rajeev\temp\websites\myfirstwebsite", "{956CC04E-FD59-49A9-9099-96888CB6F366}" // ProjectSection(WebsiteProperties) = preProject // ProjectReferences = "{FD705688-88D1-4C22-9BFF-86235D89C2FC}|CSClassLibrary1.dll;{F0726D09-042B-4A7A-8A01-6BED2422BD5D}|VCClassLibrary1.dll;" // Debug.AspNetCompiler.VirtualPath = "/publishfirst" // Debug.AspNetCompiler.PhysicalPath = "..\..\..\..\..\..\rajeev\temp\websites\myfirstwebsite\" // Debug.AspNetCompiler.TargetPath = "..\..\..\..\..\..\rajeev\temp\publishfirst\" // Debug.AspNetCompiler.ForceOverwrite = "true" // Debug.AspNetCompiler.Updateable = "true" // Debug.AspNetCompiler.Enabled = "true" // Debug.AspNetCompiler.Debug = "true" // Debug.AspNetCompiler.KeyFile = "" // Debug.AspNetCompiler.KeyContainer = "" // Debug.AspNetCompiler.DelaySign = "true" // Debug.AspNetCompiler.AllowPartiallyTrustedCallers = "true" // Debug.AspNetCompiler.FixedNames = "true" // Release.AspNetCompiler.VirtualPath = "/publishfirst" // Release.AspNetCompiler.PhysicalPath = "..\..\..\..\..\..\rajeev\temp\websites\myfirstwebsite\" // Release.AspNetCompiler.TargetPath = "..\..\..\..\..\..\rajeev\temp\publishfirst\" // Release.AspNetCompiler.ForceOverwrite = "true" // Release.AspNetCompiler.Updateable = "true" // Release.AspNetCompiler.Enabled = "true" // Release.AspNetCompiler.Debug = "false" // Release.AspNetCompiler.KeyFile = "" // Release.AspNetCompiler.KeyContainer = "" // Release.AspNetCompiler.DelaySign = "true" // Release.AspNetCompiler.AllowPartiallyTrustedCallers = "true" // Release.AspNetCompiler.FixedNames = "true" // EndProjectSection // EndProject // // This method is responsible for parsing each of the lines within the "WebsiteProperties" section. // The first component of each property name is actually the configuration for which that // property applies. int indexOfFirstDot = propertyName.IndexOf('.'); if (indexOfFirstDot != -1) { // The portion before the first dot is the configuration name. string configurationName = propertyName.Substring(0, indexOfFirstDot); // The rest of it is the actual property name. string aspNetPropertyName = propertyName.Substring(indexOfFirstDot + 1, propertyName.Length - indexOfFirstDot - 1); // And the part after the <equals> sign is the property value (which was parsed out for us prior // to calling this method). propertyValue = TrimQuotes(propertyValue); // Grab the parameters for this specific configuration if they exist. object aspNetCompilerParametersObject = proj.AspNetConfigurations[configurationName]; AspNetCompilerParameters aspNetCompilerParameters; if (aspNetCompilerParametersObject == null) { // If it didn't exist, create a new one. aspNetCompilerParameters = new AspNetCompilerParameters(); aspNetCompilerParameters.aspNetVirtualPath = String.Empty; aspNetCompilerParameters.aspNetPhysicalPath = String.Empty; aspNetCompilerParameters.aspNetTargetPath = String.Empty; aspNetCompilerParameters.aspNetForce = String.Empty; aspNetCompilerParameters.aspNetUpdateable = String.Empty; aspNetCompilerParameters.aspNetDebug = String.Empty; aspNetCompilerParameters.aspNetKeyFile = String.Empty; aspNetCompilerParameters.aspNetKeyContainer = String.Empty; aspNetCompilerParameters.aspNetDelaySign = String.Empty; aspNetCompilerParameters.aspNetAPTCA = String.Empty; aspNetCompilerParameters.aspNetFixedNames = String.Empty; } else { // Otherwise just unbox it. aspNetCompilerParameters = (AspNetCompilerParameters)aspNetCompilerParametersObject; } // Update the appropriate field within the parameters struct. if (aspNetPropertyName == "AspNetCompiler.VirtualPath") { aspNetCompilerParameters.aspNetVirtualPath = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.PhysicalPath") { aspNetCompilerParameters.aspNetPhysicalPath = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.TargetPath") { aspNetCompilerParameters.aspNetTargetPath = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.ForceOverwrite") { aspNetCompilerParameters.aspNetForce = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.Updateable") { aspNetCompilerParameters.aspNetUpdateable = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.Debug") { aspNetCompilerParameters.aspNetDebug = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.KeyFile") { aspNetCompilerParameters.aspNetKeyFile = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.KeyContainer") { aspNetCompilerParameters.aspNetKeyContainer = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.DelaySign") { aspNetCompilerParameters.aspNetDelaySign = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.AllowPartiallyTrustedCallers") { aspNetCompilerParameters.aspNetAPTCA = propertyValue; } else if (aspNetPropertyName == "AspNetCompiler.FixedNames") { aspNetCompilerParameters.aspNetFixedNames = propertyValue; } // Store the updated parameters struct back into the hashtable by configuration name. proj.AspNetConfigurations[configurationName] = aspNetCompilerParameters; } else { // ProjectReferences = "{FD705688-88D1-4C22-9BFF-86235D89C2FC}|CSClassLibrary1.dll;{F0726D09-042B-4A7A-8A01-6BED2422BD5D}|VCClassLibrary1.dll;" if (string.Compare(propertyName, "ProjectReferences", StringComparison.OrdinalIgnoreCase) == 0) { string[] projectReferenceEntries = propertyValue.Split(new char[] { ';' }); foreach (string projectReferenceEntry in projectReferenceEntries) { int indexOfBar = projectReferenceEntry.IndexOf('|'); // indexOfBar could be -1 if we had semicolons in the file names, so skip entries that // don't contain a guid. File names may not contain the '|' character if (indexOfBar != -1) { int indexOfOpeningBrace = projectReferenceEntry.IndexOf('{'); int indexOfClosingBrace = projectReferenceEntry.IndexOf('}', indexOfOpeningBrace); // Cut out the guid part if ((indexOfOpeningBrace != -1) && (indexOfClosingBrace != -1)) { string referencedProjectGuid = projectReferenceEntry.Substring(indexOfOpeningBrace, indexOfClosingBrace - indexOfOpeningBrace + 1); proj.Dependencies.Add(referencedProjectGuid); proj.ProjectReferences.Add(referencedProjectGuid); } } } } } }