From 86dfaa1bf3188e547b971412eed2a6501cc4e0f3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 24 Aug 2005 13:00:09 +0000 Subject: [PATCH] Fixed SD2-434: Reference locking issue git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@429 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CSharpCompletionBinding.cs | 13 ++++---- .../ParserService/ProjectContentRegistry.cs | 30 +++++++++++++++---- .../ParserService/ReflectionProjectContent.cs | 7 ++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs index 243b7f2236..48d1cdea11 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs @@ -99,15 +99,18 @@ namespace CSharpBinding string documentText = editor.Text; int position = editor.ActiveTextAreaControl.Caret.Offset - 2; - if (position > 0 && (documentText[position + 1] == '+' || documentText[position + 1] == '-')) { + if (position > 0 && (documentText[position + 1] == '+')) { ExpressionResult result = ef.FindFullExpression(documentText, position); if(result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line, editor.ActiveTextAreaControl.Caret.Column, editor.FileName, documentText); - if (resolveResult.ResolvedType.GetUnderlyingClass().IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) { - EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); - eventHandlerProvider.InsertSpace = true; - editor.ShowCompletionWindow(eventHandlerProvider, ch); + if (resolveResult != null && resolveResult.ResolvedType != null) { + IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass(); + if (underlyingClass.IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) { + EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); + eventHandlerProvider.InsertSpace = true; + editor.ShowCompletionWindow(eventHandlerProvider, ch); + } } } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs b/src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs index b1477a8fe7..8f221cd628 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs @@ -117,9 +117,9 @@ namespace ICSharpCode.Core try { try { if (File.Exists(itemFileName)) { - assembly = Assembly.ReflectionOnlyLoadFrom(itemFileName); + assembly = LoadReflectionOnlyAssemblyFrom(itemFileName); if (assembly != null) { - contents[itemFileName] = new ReflectionProjectContent(assembly); + contents[itemFileName] = new ReflectionProjectContent(assembly, itemFileName); contents[assembly.FullName] = contents[itemFileName]; #if DEBUG how = "ReflectionOnly"; @@ -198,15 +198,15 @@ namespace ICSharpCode.Core string path = Path.Combine(lookupDirectory, name.Name); if (File.Exists(path + ".dll")) { LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .dll file"); - return Assembly.ReflectionOnlyLoadFrom(path + ".dll"); + return LoadReflectionOnlyAssemblyFrom(path + ".dll"); } if (File.Exists(path + ".exe")) { LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .exe file"); - return Assembly.ReflectionOnlyLoadFrom(path + ".exe"); + return LoadReflectionOnlyAssemblyFrom(path + ".exe"); } if (File.Exists(path)) { LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom file"); - return Assembly.ReflectionOnlyLoadFrom(path); + return LoadReflectionOnlyAssemblyFrom(path); } try { LoggingService.Debug("AssemblyResolve trying ReflectionOnlyLoad"); @@ -221,6 +221,26 @@ namespace ICSharpCode.Core } } + static Assembly LoadReflectionOnlyAssemblyFrom(string fileName) + { + byte[] data; + using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { + if (fs.Length > 10 * 1024 * 1024) { + // more than 10 MB? Do not hold bytes in memory + return Assembly.ReflectionOnlyLoadFrom(fileName); + } + data = new byte[fs.Length]; + for (int i = 0; i < data.Length;) { + int c = fs.Read(data, i, data.Length - i); + i += c; + if (c <= 0) { + throw new IOException("Read returned " + c); + } + } + } + return Assembly.ReflectionOnlyLoad(data); + } + public static AssemblyName FindBestMatchingAssemblyName(string name) { string[] info = name.Split(','); diff --git a/src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs index bc5cbf1a82..aaa4c074fc 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs @@ -23,6 +23,11 @@ namespace ICSharpCode.Core Assembly assembly; public ReflectionProjectContent(Assembly assembly) + : this(assembly, assembly.Location) + { + } + + public ReflectionProjectContent(Assembly assembly, string assemblyLocation) { this.assembly = assembly; @@ -44,7 +49,7 @@ namespace ICSharpCode.Core AddClassToNamespaceListInternal(new ReflectionClass.VoidClass(assemblyCompilationUnit)); } - string fileName = LookupLocalizedXmlDoc(assembly.Location); + string fileName = LookupLocalizedXmlDoc(assemblyLocation); // Not found -> look in runtime directory. if (fileName == null) { string runtimeDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();