diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin b/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin index ea7931c7b0..53518c191a 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin @@ -1,7 +1,7 @@  + description = "Can open Red Gate's .NET Reflector on a selected class or member."> diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs index 3dc7d8e38c..d6fd6b0fe9 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs @@ -13,6 +13,8 @@ using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; using System.Text; +using System.Threading; +using System.Windows.Forms; using ICSharpCode.Core; @@ -21,13 +23,13 @@ using Reflector.IpcServer; namespace ReflectorAddIn { /// - /// Controls Lutz Roeders's .NET Reflector. + /// Controls .NET Reflector. /// public static class ReflectorController { #region Connecting - public static IReflectorService SafeConnect(System.Windows.Forms.IWin32Window owner) + public static IReflectorService SafeConnect(IWin32Window owner) { try { return Connect(owner); @@ -56,7 +58,7 @@ namespace ReflectorAddIn /// Ensures that an instance of Reflector is running and connects to it. /// /// The that can be used to control the running instance of Reflector. - public static IReflectorService Connect(System.Windows.Forms.IWin32Window owner) + public static IReflectorService Connect(IWin32Window owner) { IReflectorService service = null; try { @@ -157,7 +159,7 @@ namespace ReflectorAddIn // ******************************************************************************************************************************** - public static void TryGoTo(CodeElementInfo element, System.Windows.Forms.IWin32Window owner) + public static void TryGoTo(CodeElementInfo element, IWin32Window owner) { IReflectorService s = null; try { @@ -165,10 +167,23 @@ namespace ReflectorAddIn s = SafeConnect(owner); if (s == null) return; - s.GoTo(element); + DateTime start = DateTime.UtcNow; + + while (!s.IsReady && (DateTime.UtcNow - start).TotalSeconds < 20) { + Application.DoEvents(); + Thread.Sleep(100); + } + + if (s.IsReady) { + s.GoTo(element); + } else { + MessageService.ShowError("Timed out while waiting for the Reflector service to become ready."); + } } catch (System.Runtime.Remoting.RemotingException ex) { ShowRemotingError(ex); + } catch (InvalidOperationException ex) { + ShowRemotingError(ex); } finally { if (s != null) { Disconnect(s); diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs index 685c1407a0..d93259df26 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ // // // -// $Revision$ +// $Revision: 9 $ // using System; @@ -13,7 +13,7 @@ using System.Runtime.InteropServices; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Reflector.IpcServer.AddIn")] -[assembly: AssemblyDescription("IPC server AddIn for Lutz Roeder's .NET Reflector")] +[assembly: AssemblyDescription("IPC server AddIn for Red Gate's .NET Reflector")] #if DEBUG [assembly: AssemblyConfiguration("Debug")] #else @@ -37,4 +37,4 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("5.0.0.8")] +[assembly: AssemblyVersion("5.0.1.10")] diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs index 9bf91f5f99..03d0dfd315 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs @@ -16,15 +16,24 @@ namespace Reflector.IpcServer.AddIn /// /// Provides the ability to remote-control Reflector. /// - public sealed class ReflectorService : MarshalByRefObject, IReflectorService + public sealed class ReflectorService : MarshalByRefObject, IReflectorService, IDisposable { readonly IServiceProvider serviceProvider; readonly Dictionary assemblyLastWriteTimes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + DateTime lastAssemblyLoadedAt = DateTime.MinValue; + public ReflectorService(IServiceProvider serviceProvider) { if (serviceProvider == null) throw new ArgumentNullException("serviceProvider"); this.serviceProvider = serviceProvider; + this.AssemblyManager.AssemblyLoaded += this.AssemblyLoaded; + } + + public void Dispose() + { + this.AssemblyManager.AssemblyLoaded -= this.AssemblyLoaded; + this.assemblyLastWriteTimes.Clear(); } /// @@ -37,6 +46,18 @@ namespace Reflector.IpcServer.AddIn return true; } + public bool IsReady { + get { + return this.lastAssemblyLoadedAt != DateTime.MinValue && + (DateTime.UtcNow - this.lastAssemblyLoadedAt).TotalSeconds > 1; + } + } + + void AssemblyLoaded(object sender, EventArgs e) + { + this.lastAssemblyLoadedAt = DateTime.UtcNow; + } + // ******************************************************************************************************************************** T GetService() @@ -66,6 +87,7 @@ namespace Reflector.IpcServer.AddIn public void GoTo(CodeElementInfo element) { if (element == null) throw new ArgumentNullException("element"); + if (!this.IsReady) throw new InvalidOperationException("The service is not ready."); WindowManager.Content.BeginInvoke(new Action(GoToInternal), new object[] { element }); } @@ -97,6 +119,9 @@ namespace Reflector.IpcServer.AddIn Form topForm = WindowManager.Content.FindForm(); if (topForm != null) { // Force the Reflector window to the top + if (topForm.WindowState == FormWindowState.Minimized) { + topForm.WindowState = FormWindowState.Normal; + } topForm.TopMost = true; topForm.TopMost = false; } diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs index c04f0b20f2..20d832b602 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs @@ -79,6 +79,10 @@ namespace Reflector.IpcServer.AddIn public void Unload() { if (serviceInstance != null) { + try { + serviceInstance.Dispose(); + } catch { + } try { RemotingServices.Disconnect(serviceInstance); } catch (RemotingException) { diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln index 1626c81762..b53f4f6be4 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 -# SharpDevelop 3.0.0.3217 +# SharpDevelop 3.0.0.3544 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reflector.IpcServer", "Reflector.IpcServer\Reflector.IpcServer.csproj", "{75B91F9E-C91D-4A12-8BDE-092B831D11DD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reflector.IpcServer.AddIn", "Reflector.IpcServer.AddIn\Reflector.IpcServer.AddIn.csproj", "{D27CA9CB-5740-4818-889D-74C16A6FFD5F}" @@ -16,5 +16,9 @@ Global {75B91F9E-C91D-4A12-8BDE-092B831D11DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {D27CA9CB-5740-4818-889D-74C16A6FFD5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D27CA9CB-5740-4818-889D-74C16A6FFD5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D27CA9CB-5740-4818-889D-74C16A6FFD5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D27CA9CB-5740-4818-889D-74C16A6FFD5F}.Release|Any CPU.Build.0 = Release|Any CPU + {75B91F9E-C91D-4A12-8BDE-092B831D11DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75B91F9E-C91D-4A12-8BDE-092B831D11DD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs index ba52921101..84936007f7 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ // // // -// $Revision$ +// $Revision: 9 $ // using System; @@ -13,7 +13,7 @@ using System.Runtime.InteropServices; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Reflector.IpcServer")] -[assembly: AssemblyDescription("IPC server module for Lutz Roeder's .NET Reflector")] +[assembly: AssemblyDescription("IPC server module for Red Gate's .NET Reflector")] #if DEBUG [assembly: AssemblyConfiguration("Debug")] #else @@ -37,4 +37,4 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("5.0.0.3")] +[assembly: AssemblyVersion("5.0.1.9")] diff --git a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs index 74b533061f..41d62127b6 100644 --- a/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs +++ b/src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs @@ -20,6 +20,13 @@ namespace Reflector.IpcServer /// true. bool CheckIsThere(); + /// + /// Gets whether the Reflector service is ready to accept commands. + /// + bool IsReady { + get; + } + /// /// Positions the assembly browser of Reflector on the element /// that best matches the parameters contained in the parameter @@ -27,6 +34,7 @@ namespace Reflector.IpcServer /// /// A object that describes the element to go to. /// The parameter is null. + /// The service is not ready (the property is false). void GoTo(CodeElementInfo element); } }