From f4d79bc9514285c4428dc8ffeed92737f6adba65 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 19 Nov 2007 16:49:09 +0000 Subject: [PATCH] Improved finding xml documentation (now supports redirections). Add support for compiling for Compact Framework 3.5. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2743 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 3 + .../Project/SharpDevelop.Build.CSharp.targets | 12 ++-- .../OptionPanels/IDEOptions/LoadSavePanel.cs | 1 - .../OptionPanels/ProjectOptions/CreateKey.cs | 2 +- .../Templates/Project/ProjectTemplate.cs | 3 +- .../Project/Src/Project/Solution/Solution.cs | 8 +-- .../Src/Services/File/FileChangeWatcher.cs | 2 - .../Services/ParserService/DomHostCallback.cs | 35 --------- .../NetCFProjectContentRegistry.cs | 72 ++++++++----------- .../Src/Services/FileUtility/FileUtility.cs | 45 ++++++------ .../Program.cs | 8 +-- .../app.config | 4 +- .../ProjectContent/DefaultProjectContent.cs | 15 ---- .../ProjectContent/ProjectContentRegistry.cs | 3 +- .../ReflectionProjectContent.cs | 4 +- .../Project/Src/XmlDoc.cs | 68 +++++++++++++++++- .../Resources/SharpDevelop.exe.manifest | 17 ----- src/Main/StartUp/Project/app.template.config | 4 +- 18 files changed, 148 insertions(+), 158 deletions(-) delete mode 100644 src/Main/StartUp/Project/Resources/SharpDevelop.exe.manifest diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 88bb4c9b73..78d4629e49 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -2183,6 +2183,9 @@ + + + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.CSharp.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.CSharp.targets index c1c64152c9..2ca45a6ee1 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.CSharp.targets +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.CSharp.targets @@ -18,23 +18,27 @@ v2.0 CF + + v3.5 + CF + Mono - + - + - + @@ -62,6 +66,6 @@ - diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs index f9acc73726..3d8307b1c1 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs @@ -8,7 +8,6 @@ using System; using System.Windows.Forms; using ICSharpCode.Core; -using FileChangeWatcher = ICSharpCode.SharpDevelop.FileChangeWatcher; namespace ICSharpCode.SharpDevelop.Gui.OptionPanels { diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/CreateKey.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/CreateKey.cs index 4ffe521aa2..b25408a85e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/CreateKey.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/CreateKey.cs @@ -99,7 +99,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels public static string StrongNameTool { get { - return FileUtility.NetSdkInstallRoot + "bin\\sn.exe"; + return Path.Combine(FileUtility.NetSdkInstallRoot, "bin\\sn.exe"); } } } diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs index 63f1f4727d..25144855af 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs @@ -29,13 +29,14 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates public readonly static TargetFramework Net35 = new TargetFramework("v3.5", ".NET Framework 3.5") { BasedOn = Net30 }; public readonly static TargetFramework CF = new TargetFramework("CF", null); public readonly static TargetFramework CF20 = new TargetFramework("CF 2.0", "Compact Framework 2.0") { BasedOn = CF }; + public readonly static TargetFramework CF35 = new TargetFramework("CF 3.5", "Compact Framework 3.5") { BasedOn = CF20 }; public readonly static TargetFramework Mono = new TargetFramework("Mono", null); public readonly static TargetFramework Mono10 = new TargetFramework("Mono v1.1", "Mono 1.1") { BasedOn = Mono }; public readonly static TargetFramework Mono20 = new TargetFramework("Mono v2.0", "Mono 2.0") { BasedOn = Mono10 }; public readonly static TargetFramework[] TargetFrameworks = { Net35, Net30, Net20, - CF, CF20, + CF, CF35, CF20, Mono, Mono20, Mono10 }; diff --git a/src/Main/Base/Project/Src/Project/Solution/Solution.cs b/src/Main/Base/Project/Src/Project/Solution/Solution.cs index 03bfe3827a..dd07599efc 100644 --- a/src/Main/Base/Project/Src/Project/Solution/Solution.cs +++ b/src/Main/Base/Project/Src/Project/Solution/Solution.cs @@ -261,7 +261,7 @@ namespace ICSharpCode.SharpDevelop.Project new string [] {fileName}); if (attemptOverwrite) { try { - attributes = (int) attributes - FileAttributes.ReadOnly; + attributes &= ~FileAttributes.ReadOnly; File.SetAttributes(fileName, attributes); Save(fileName); return; @@ -356,16 +356,16 @@ namespace ICSharpCode.SharpDevelop.Project // we need to specify UTF8 because MSBuild needs the BOM using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8)) { sw.WriteLine(); - int versionNumber = 9; + int versionNumber = SolutionVersionVS05; foreach (IProject p in this.Projects) { if (p.MinimumSolutionVersion > versionNumber) versionNumber = p.MinimumSolutionVersion; } sw.WriteLine("Microsoft Visual Studio Solution File, Format Version " + versionNumber + ".00"); - if (versionNumber == 9) { + if (versionNumber == SolutionVersionVS05) { sw.WriteLine("# Visual Studio 2005"); - } else if (versionNumber == 10) { + } else if (versionNumber == SolutionVersionVS08) { sw.WriteLine("# Visual Studio 2008"); } sw.WriteLine("# SharpDevelop " + RevisionClass.FullVersion); diff --git a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs index 4193118e41..b60dcca9ad 100644 --- a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs @@ -14,7 +14,6 @@ using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop { - #region FileChangeWatcher internal sealed class FileChangeWatcher //: IDisposable { /*FileSystemWatcher watcher; @@ -122,5 +121,4 @@ namespace ICSharpCode.SharpDevelop } */ } - #endregion } diff --git a/src/Main/Base/Project/Src/Services/ParserService/DomHostCallback.cs b/src/Main/Base/Project/Src/Services/ParserService/DomHostCallback.cs index 52b0a70441..da0111b6fc 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/DomHostCallback.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/DomHostCallback.cs @@ -51,13 +51,6 @@ namespace ICSharpCode.SharpDevelop }; HostCallback.InitializeCodeGeneratorOptions = AmbienceService.InitializeCodeGeneratorOptions; - - string dir = WinFXReferenceDirectory; - if (!string.IsNullOrEmpty(dir)) - XmlDoc.XmlDocLookupDirectories.Add(dir); - dir = XNAReferenceDirectory; - if (!string.IsNullOrEmpty(dir)) - XmlDoc.XmlDocLookupDirectories.Add(dir); } static void ShowAssemblyLoadError(string fileName, string include, string message) @@ -70,33 +63,5 @@ namespace ICSharpCode.SharpDevelop ) + "\r\n" + message + "\r\n" ); } - - static string WinFXReferenceDirectory { - get { - RegistryKey k = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup\Windows Communication Foundation"); - if (k == null) - return null; - object o = k.GetValue("ReferenceInstallPath"); - k.Close(); - if (o == null) - return null; - else - return o.ToString(); - } - } - - static string XNAReferenceDirectory { - get { - RegistryKey k = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\XNA\Game Studio Express\v1.0"); - if (k == null) - return null; - object o = k.GetValue("InstallPath"); - k.Close(); - if (o == null) - return null; - else - return Path.Combine(o.ToString(), @"References\Windows\x86"); - } - } } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs b/src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs index b4a1a8dfcc..13c60e8c9b 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs @@ -12,18 +12,25 @@ using Microsoft.Win32; namespace ICSharpCode.SharpDevelop { - public class NetCF20ProjectContentRegistry : ProjectContentRegistry + public abstract class NetCFProjectContentRegistry : ProjectContentRegistry { public override IProjectContent Mscorlib { get { - return GetProjectContentForReference("mscorlib", "mscorlib"); + string folder = GetInstallFolder(); + if (folder != null) + return GetProjectContentForReference("mscorlib", Path.Combine(folder, "mscorlib.dll")); + else + return GetProjectContentForReference("mscorlib", "mscorlib"); } } - static string GetInstallFolder() + protected abstract string AssemblyFolderRegKey { + get; + } + + string GetInstallFolder() { - const string regkey = @"SOFTWARE\Microsoft\.NETCompactFramework\v2.0.0.0\WindowsCE\AssemblyFoldersEx"; - RegistryKey key = Registry.LocalMachine.OpenSubKey(regkey); + RegistryKey key = Registry.LocalMachine.OpenSubKey(AssemblyFolderRegKey); if (key != null) { string dir = key.GetValue(null) as string; key.Close(); @@ -32,45 +39,28 @@ namespace ICSharpCode.SharpDevelop return null; } - /* - Is this still required now that we use MSBuild to resolve assembly references? - protected override IProjectContent LoadProjectContent(string itemInclude, string itemFileName) + protected override System.Reflection.Assembly GetDefaultAssembly(string shortName) { - if (File.Exists(itemFileName)) { - // we cannot reuse project contents from the default registry because they would - // reference the wrong mscorlib version, causing code-completion problems - // when a CF application references a CF library - return base.LoadProjectContent(itemInclude, itemFileName); + // do not use default assemblies, but pick the CF version + return null; + } + } + + public class NetCF20ProjectContentRegistry : NetCFProjectContentRegistry + { + protected override string AssemblyFolderRegKey { + get { + return @"SOFTWARE\Microsoft\.NETCompactFramework\v2.0.0.0\WindowsCE\AssemblyFoldersEx"; } - string netPath = GetInstallFolder(); - if (!string.IsNullOrEmpty(netPath) && File.Exists(Path.Combine(netPath, "mscorlib.dll"))) { - string shortName = itemInclude; - int pos = shortName.IndexOf(','); - if (pos > 0) - shortName = shortName.Substring(0, pos); - - if (File.Exists(Path.Combine(netPath, shortName + ".dll"))) { - ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName + ".dll"), this); - if (rpc != null) { - redirectedAssemblyNames.Add(shortName, rpc.AssemblyFullName); - } - return rpc; - } else if (File.Exists(Path.Combine(netPath, shortName))) { - // perhaps shortName includes file extension - ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName), this); - if (rpc != null) { - redirectedAssemblyNames.Add(Path.GetFileNameWithoutExtension(shortName), rpc.AssemblyFullName); - } - return rpc; - } - } else { - string message = "Warning: .NET Compact Framework SDK is not installed." + Environment.NewLine; - if (!TaskService.BuildMessageViewCategory.Text.Contains(message)) { - TaskService.BuildMessageViewCategory.AppendText(message); - } + } + } + + public class NetCF35ProjectContentRegistry : NetCFProjectContentRegistry + { + protected override string AssemblyFolderRegKey { + get { + return @"SOFTWARE\Microsoft\.NETCompactFramework\v3.5.0.0\WindowsCE\AssemblyFoldersEx"; } - return base.LoadProjectContent(itemInclude, itemFileName); } - */ } } diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs index 9c62490ddb..3f93ed5549 100644 --- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs +++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs @@ -49,15 +49,27 @@ namespace ICSharpCode.Core } } + static string GetPathFromRegistry(string key, string valueName) + { + using (RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey(key)) { + if (installRootKey != null) { + object o = installRootKey.GetValue(valueName); + if (o != null) { + string r = o.ToString(); + if (!string.IsNullOrEmpty(r)) + return r; + } + } + } + return null; + } + /// /// Gets the installation root of the .NET Framework (@"C:\Windows\Microsoft.NET\Framework\") /// public static string NETFrameworkInstallRoot { get { - using (RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework")) { - object o = installRootKey.GetValue("InstallRoot"); - return o == null ? String.Empty : o.ToString(); - } + return GetPathFromRegistry(@"SOFTWARE\Microsoft\.NETFramework", "InstallRoot") ?? string.Empty; } } @@ -67,23 +79,10 @@ namespace ICSharpCode.Core /// public static string NetSdkInstallRoot { get { - string val = String.Empty; - RegistryKey sdkRootKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0"); - if (sdkRootKey != null) { - object o = sdkRootKey.GetValue("InstallationFolder"); - val = o == null ? String.Empty : o.ToString(); - sdkRootKey.Close(); - } - - if (val.Length == 0) { - RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework"); - if (installRootKey != null) { - object o = installRootKey.GetValue("sdkInstallRootv2.0"); - val = o == null ? String.Empty : o.ToString(); - installRootKey.Close(); - } - } - return val; + return GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0a", "InstallationFolder") + ?? GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0", "InstallationFolder") + ?? GetPathFromRegistry(@"SOFTWARE\Microsoft\.NETFramework", "sdkInstallRootv2.0") + ?? string.Empty; } } @@ -252,10 +251,10 @@ namespace ICSharpCode.Core /// static void SearchDirectory(string directory, string filemask, List collection, bool searchSubdirectories, bool ignoreHidden) { - // If Directory.GetFiles() searches the 8.3 name as well as the full name so if the filemask is + // If Directory.GetFiles() searches the 8.3 name as well as the full name so if the filemask is // "*.xpt" it will return "Template.xpt~" bool isExtMatch = Regex.IsMatch(filemask, @"^\*\..{3}$"); - string ext = null; + string ext = null; string[] file = Directory.GetFiles(directory, filemask); if (isExtMatch) ext = filemask.Remove(0,1); diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs index 8bdd0de987..66d4bd0a89 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs @@ -38,10 +38,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker ShowMessageBox(ex.ToString()); } } else { - Program.Log("ICSharpCode.SharpDevelop.BuildWorker.exe is used to compile " + - "MSBuild projects inside SharpDevelop."); - Program.Log("If you want to compile projects on the command line, use " + - "MSBuild.exe (part of the .NET Framework)"); + Console.WriteLine("ICSharpCode.SharpDevelop.BuildWorker.exe is used to compile " + + "MSBuild projects inside SharpDevelop."); + Console.WriteLine("If you want to compile projects on the command line, use " + + "MSBuild.exe (part of the .NET Framework)"); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config index acbc7ec0cc..aa701ee4ae 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config @@ -6,10 +6,10 @@ - + diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs index 836d44e2cb..19aff434e4 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs @@ -219,21 +219,6 @@ namespace ICSharpCode.SharpDevelop.Dom return null; } - protected static string LookupLocalizedXmlDoc(string fileName) - { - string xmlFileName = Path.ChangeExtension(fileName, ".xml"); - string localizedXmlDocFile = Path.GetDirectoryName(fileName); - localizedXmlDocFile = Path.Combine(localizedXmlDocFile, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName); - localizedXmlDocFile = Path.Combine(localizedXmlDocFile, Path.GetFileName(xmlFileName)); - if (File.Exists(localizedXmlDocFile)) { - return localizedXmlDocFile; - } - if (File.Exists(xmlFileName)) { - return xmlFileName; - } - return null; - } - public virtual void Dispose() { xmlDoc.Dispose(); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs index 1dad24f3f9..6171317780 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs @@ -363,7 +363,7 @@ namespace ICSharpCode.SharpDevelop.Dom } } - static Assembly GetDefaultAssembly(string shortName) + protected virtual Assembly GetDefaultAssembly(string shortName) { // These assemblies are already loaded by SharpDevelop, so we // don't need to load them in a separate AppDomain/with Cecil. @@ -401,3 +401,4 @@ namespace ICSharpCode.SharpDevelop.Dom } } + diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs index bf3230de45..272436df11 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs @@ -109,11 +109,11 @@ namespace ICSharpCode.SharpDevelop.Dom LoggingService.Warn(ex); } - string fileName = LookupLocalizedXmlDoc(assemblyLocation); + string fileName = XmlDoc.LookupLocalizedXmlDoc(assemblyLocation); if (fileName == null) { // Not found -> look in other directories: foreach (string testDirectory in XmlDoc.XmlDocLookupDirectories) { - fileName = LookupLocalizedXmlDoc(Path.Combine(testDirectory, Path.GetFileName(assemblyLocation))); + fileName = XmlDoc.LookupLocalizedXmlDoc(Path.Combine(testDirectory, Path.GetFileName(assemblyLocation))); if (fileName != null) break; } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs index efb85c4c33..bfe61f1381 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs @@ -18,9 +18,9 @@ namespace ICSharpCode.SharpDevelop.Dom /// public sealed class XmlDoc : IDisposable { - static readonly List xmlDocLookupDirectories = new List( - new string[] { System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() } - ); + static readonly List xmlDocLookupDirectories = new List { + System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() + }; public static IList XmlDocLookupDirectories { get { return xmlDocLookupDirectories; } @@ -246,6 +246,11 @@ namespace ICSharpCode.SharpDevelop.Dom } public static XmlDoc Load(string fileName, string cachePath) + { + return Load(fileName, cachePath, true); + } + + static XmlDoc Load(string fileName, string cachePath, bool allowRedirect) { //LoggingService.Debug("Loading XmlDoc for " + fileName); XmlDoc doc; @@ -270,6 +275,17 @@ namespace ICSharpCode.SharpDevelop.Dom try { using (XmlTextReader xmlReader = new XmlTextReader(fileName)) { + xmlReader.MoveToContent(); + if (allowRedirect && !string.IsNullOrEmpty(xmlReader.GetAttribute("redirect"))) { + string redirectionTarget = GetRedirectionTarget(xmlReader.GetAttribute("redirect")); + if (redirectionTarget != null) { + LoggingService.Info("XmlDoc " + fileName + " is redirecting to " + redirectionTarget); + return Load(redirectionTarget, cachePath, false); + } else { + LoggingService.Warn("XmlDoc " + fileName + " is redirecting to " + xmlReader.GetAttribute("redirect") + ", but that file was not found."); + return new XmlDoc(); + } + } doc = Load(xmlReader); } } catch (XmlException ex) { @@ -292,5 +308,51 @@ namespace ICSharpCode.SharpDevelop.Dom } return doc; } + + static string GetRedirectionTarget(string target) + { + string programFilesDir = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); + if (!programFilesDir.EndsWith("\\") && !programFilesDir.EndsWith("/")) + programFilesDir += "\\"; + + string corSysDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); + if (!corSysDir.EndsWith("\\") && !corSysDir.EndsWith("/")) + corSysDir += "\\"; + + return LookupLocalizedXmlDoc(target.Replace("%PROGRAMFILESDIR%", programFilesDir) + .Replace("%CORSYSDIR%", corSysDir)); + } + + internal static string LookupLocalizedXmlDoc(string fileName) + { + string xmlFileName = Path.ChangeExtension(fileName, ".xml"); + string currentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName; + string localizedXmlDocFile = GetLocalizedName(xmlFileName, currentCulture); + + LoggingService.Debug("Try find XMLDoc @" + localizedXmlDocFile); + if (File.Exists(localizedXmlDocFile)) { + return localizedXmlDocFile; + } + LoggingService.Debug("Try find XMLDoc @" + xmlFileName); + if (File.Exists(xmlFileName)) { + return xmlFileName; + } + if (currentCulture != "en") { + string englishXmlDocFile = GetLocalizedName(xmlFileName, "en"); + LoggingService.Debug("Try find XMLDoc @" + englishXmlDocFile); + if (File.Exists(englishXmlDocFile)) { + return englishXmlDocFile; + } + } + return null; + } + + static string GetLocalizedName(string fileName, string language) + { + string localizedXmlDocFile = Path.GetDirectoryName(fileName); + localizedXmlDocFile = Path.Combine(localizedXmlDocFile, language); + localizedXmlDocFile = Path.Combine(localizedXmlDocFile, Path.GetFileName(fileName)); + return localizedXmlDocFile; + } } } diff --git a/src/Main/StartUp/Project/Resources/SharpDevelop.exe.manifest b/src/Main/StartUp/Project/Resources/SharpDevelop.exe.manifest deleted file mode 100644 index ae77ef9da7..0000000000 --- a/src/Main/StartUp/Project/Resources/SharpDevelop.exe.manifest +++ /dev/null @@ -1,17 +0,0 @@ - - - - A free .NET IDE - - - - - - diff --git a/src/Main/StartUp/Project/app.template.config b/src/Main/StartUp/Project/app.template.config index 239ab07ad9..20723149f3 100644 --- a/src/Main/StartUp/Project/app.template.config +++ b/src/Main/StartUp/Project/app.template.config @@ -43,10 +43,10 @@ - +