public static string GetRelativePath(string basePath, string subPath) { VerifyStringArgument(basePath, "basePath"); VerifyStringArgument(subPath, "subPath"); if (!Path.IsPathRooted(basePath)) { throw new ArgumentException("The 'basePath' is not rooted."); } if (!Path.IsPathRooted(subPath)) { return(subPath); } if (!String.Equals(Path.GetPathRoot(basePath), Path.GetPathRoot(subPath), StringComparison.OrdinalIgnoreCase)) { // both paths have different roots so we can't make them relative return(subPath); } // Url.MakeRelative method requires the base path to be ended with a '\' if it is a folder, // otherwise it considers it as a file so we need to make sure that the folder path is right basePath = WixHelperMethods.EnsureTrailingDirectoryChar(basePath.Trim()); Url url = new Url(basePath); return(url.MakeRelative(new Url(subPath))); }
/// <summary> /// When building with only a wixproj in the solution, the SolutionX variables are not /// defined, so we have to define them here. /// </summary> /// <param name="project">The project where the properties are defined.</param> internal static void DefineSolutionProperties(WixProjectNode project) { IVsSolution solution = WixHelperMethods.GetService <IVsSolution, SVsSolution>(project.Site); object solutionPathObj; ErrorHandler.ThrowOnFailure(solution.GetProperty((int)__VSPROPID.VSPROPID_SolutionFileName, out solutionPathObj)); string solutionPath = (string)solutionPathObj; WixPackageSettings settings = project.WixPackage.Settings; string devEnvDir = WixHelperMethods.EnsureTrailingDirectoryChar(Path.GetDirectoryName(settings.DevEnvPath)); string[][] properties = new string[][] { new string[] { WixProjectFileConstants.DevEnvDir, devEnvDir }, new string[] { WixProjectFileConstants.SolutionPath, solutionPath }, new string[] { WixProjectFileConstants.SolutionDir, WixHelperMethods.EnsureTrailingDirectoryChar(Path.GetDirectoryName(solutionPath)) }, new string[] { WixProjectFileConstants.SolutionExt, Path.GetExtension(solutionPath) }, new string[] { WixProjectFileConstants.SolutionFileName, Path.GetFileName(solutionPath) }, new string[] { WixProjectFileConstants.SolutionName, Path.GetFileNameWithoutExtension(solutionPath) }, }; foreach (string[] property in properties) { string propertyName = property[0]; string propertyValue = property[1]; project.BuildProject.SetGlobalProperty(propertyName, propertyValue); } }
/// <summary> /// Initialize common project properties with default value if they are empty. /// </summary> /// <remarks> /// The following common project properties are defaulted to projectName (if empty): ToolPath. /// If the project filename is not set then no properties are set. /// </remarks> protected override void InitializeProjectProperties() { // make sure the project file name has been set if (String.IsNullOrEmpty(this.FileName) || String.IsNullOrEmpty(Path.GetFileNameWithoutExtension(this.FileName))) { return; } // initialize the WixToolPath property from the value in the registry string toolsDirectory = this.package.Settings.ToolsDirectory; string programFilesDirectory = WixHelperMethods.EnsureTrailingDirectoryChar(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)); // if the path in the registry starts with the same path as program files, then just put in $(ProgramFiles) to make it more portable if (toolsDirectory.StartsWith(programFilesDirectory, StringComparison.OrdinalIgnoreCase)) { toolsDirectory = "$(ProgramFiles)\\" + toolsDirectory.Substring(programFilesDirectory.Length); } this.SetProjectProperty(WixProjectFileConstants.WixToolPath, toolsDirectory); }