Browse Source

Reflector AddIn: Wait until assembly loading is finished after starting Reflector. Restore the Reflector form when it is minimized.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3550 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Christian Hornung 18 years ago
parent
commit
c6c52a4d9b
  1. 2
      src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin
  2. 25
      src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs
  3. 6
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs
  4. 27
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs
  5. 4
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs
  6. 6
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln
  7. 6
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs
  8. 8
      src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs

2
src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/ReflectorAddIn.addin

@ -1,7 +1,7 @@
<AddIn name = "ReflectorAddIn" <AddIn name = "ReflectorAddIn"
author = "Christian Hornung" author = "Christian Hornung"
copyright = "prj:///doc/copyright.txt" copyright = "prj:///doc/copyright.txt"
description = "Can open Lutz Roeder's .NET Reflector on a selected class or member."> description = "Can open Red Gate's .NET Reflector on a selected class or member.">
<Manifest> <Manifest>
<Identity name="ReflectorAddIn" /> <Identity name="ReflectorAddIn" />

25
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;
using System.Runtime.Remoting.Channels.Ipc; using System.Runtime.Remoting.Channels.Ipc;
using System.Text; using System.Text;
using System.Threading;
using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -21,13 +23,13 @@ using Reflector.IpcServer;
namespace ReflectorAddIn namespace ReflectorAddIn
{ {
/// <summary> /// <summary>
/// Controls Lutz Roeders's .NET Reflector. /// Controls .NET Reflector.
/// </summary> /// </summary>
public static class ReflectorController public static class ReflectorController
{ {
#region Connecting #region Connecting
public static IReflectorService SafeConnect(System.Windows.Forms.IWin32Window owner) public static IReflectorService SafeConnect(IWin32Window owner)
{ {
try { try {
return Connect(owner); return Connect(owner);
@ -56,7 +58,7 @@ namespace ReflectorAddIn
/// Ensures that an instance of Reflector is running and connects to it. /// Ensures that an instance of Reflector is running and connects to it.
/// </summary> /// </summary>
/// <returns>The <see cref="IReflectorService"/> that can be used to control the running instance of Reflector.</returns> /// <returns>The <see cref="IReflectorService"/> that can be used to control the running instance of Reflector.</returns>
public static IReflectorService Connect(System.Windows.Forms.IWin32Window owner) public static IReflectorService Connect(IWin32Window owner)
{ {
IReflectorService service = null; IReflectorService service = null;
try { 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; IReflectorService s = null;
try { try {
@ -165,10 +167,23 @@ namespace ReflectorAddIn
s = SafeConnect(owner); s = SafeConnect(owner);
if (s == null) return; 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) { } catch (System.Runtime.Remoting.RemotingException ex) {
ShowRemotingError(ex); ShowRemotingError(ex);
} catch (InvalidOperationException ex) {
ShowRemotingError(ex);
} finally { } finally {
if (s != null) { if (s != null) {
Disconnect(s); Disconnect(s);

6
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/Properties/AssemblyInfo.cs

@ -2,7 +2,7 @@
// <copyright see="prj:///doc/copyright.txt"/> // <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/> // <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/> // <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version> // <version>$Revision: 9 $</version>
// </file> // </file>
using System; using System;
@ -13,7 +13,7 @@ using System.Runtime.InteropServices;
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("Reflector.IpcServer.AddIn")] [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 #if DEBUG
[assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyConfiguration("Debug")]
#else #else
@ -37,4 +37,4 @@ using System.Runtime.InteropServices;
// //
// You can specify all the values or you can use the default the Revision and // You can specify all the values or you can use the default the Revision and
// Build Numbers by using the '*' as shown below: // Build Numbers by using the '*' as shown below:
[assembly: AssemblyVersion("5.0.0.8")] [assembly: AssemblyVersion("5.0.1.10")]

27
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ReflectorService.cs

@ -16,15 +16,24 @@ namespace Reflector.IpcServer.AddIn
/// <summary> /// <summary>
/// Provides the ability to remote-control Reflector. /// Provides the ability to remote-control Reflector.
/// </summary> /// </summary>
public sealed class ReflectorService : MarshalByRefObject, IReflectorService public sealed class ReflectorService : MarshalByRefObject, IReflectorService, IDisposable
{ {
readonly IServiceProvider serviceProvider; readonly IServiceProvider serviceProvider;
readonly Dictionary<string, DateTime> assemblyLastWriteTimes = new Dictionary<string, DateTime>(StringComparer.InvariantCultureIgnoreCase); readonly Dictionary<string, DateTime> assemblyLastWriteTimes = new Dictionary<string, DateTime>(StringComparer.InvariantCultureIgnoreCase);
DateTime lastAssemblyLoadedAt = DateTime.MinValue;
public ReflectorService(IServiceProvider serviceProvider) public ReflectorService(IServiceProvider serviceProvider)
{ {
if (serviceProvider == null) throw new ArgumentNullException("serviceProvider"); if (serviceProvider == null) throw new ArgumentNullException("serviceProvider");
this.serviceProvider = serviceProvider; this.serviceProvider = serviceProvider;
this.AssemblyManager.AssemblyLoaded += this.AssemblyLoaded;
}
public void Dispose()
{
this.AssemblyManager.AssemblyLoaded -= this.AssemblyLoaded;
this.assemblyLastWriteTimes.Clear();
} }
/// <summary> /// <summary>
@ -37,6 +46,18 @@ namespace Reflector.IpcServer.AddIn
return true; 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<T>() T GetService<T>()
@ -66,6 +87,7 @@ namespace Reflector.IpcServer.AddIn
public void GoTo(CodeElementInfo element) public void GoTo(CodeElementInfo element)
{ {
if (element == null) throw new ArgumentNullException("element"); if (element == null) throw new ArgumentNullException("element");
if (!this.IsReady) throw new InvalidOperationException("The service is not ready.");
WindowManager.Content.BeginInvoke(new Action<CodeElementInfo>(GoToInternal), WindowManager.Content.BeginInvoke(new Action<CodeElementInfo>(GoToInternal),
new object[] { element }); new object[] { element });
} }
@ -97,6 +119,9 @@ namespace Reflector.IpcServer.AddIn
Form topForm = WindowManager.Content.FindForm(); Form topForm = WindowManager.Content.FindForm();
if (topForm != null) { if (topForm != null) {
// Force the Reflector window to the top // Force the Reflector window to the top
if (topForm.WindowState == FormWindowState.Minimized) {
topForm.WindowState = FormWindowState.Normal;
}
topForm.TopMost = true; topForm.TopMost = true;
topForm.TopMost = false; topForm.TopMost = false;
} }

4
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.AddIn/src/ServiceLoader.cs

@ -79,6 +79,10 @@ namespace Reflector.IpcServer.AddIn
public void Unload() public void Unload()
{ {
if (serviceInstance != null) { if (serviceInstance != null) {
try {
serviceInstance.Dispose();
} catch {
}
try { try {
RemotingServices.Disconnect(serviceInstance); RemotingServices.Disconnect(serviceInstance);
} catch (RemotingException) { } catch (RemotingException) {

6
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 10.00 Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008 # 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}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reflector.IpcServer", "Reflector.IpcServer\Reflector.IpcServer.csproj", "{75B91F9E-C91D-4A12-8BDE-092B831D11DD}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reflector.IpcServer.AddIn", "Reflector.IpcServer.AddIn\Reflector.IpcServer.AddIn.csproj", "{D27CA9CB-5740-4818-889D-74C16A6FFD5F}" 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 {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}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D27CA9CB-5740-4818-889D-74C16A6FFD5F}.Release|Any CPU.ActiveCfg = Release|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 EndGlobalSection
EndGlobal EndGlobal

6
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/Properties/AssemblyInfo.cs

@ -2,7 +2,7 @@
// <copyright see="prj:///doc/copyright.txt"/> // <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/> // <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/> // <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version> // <version>$Revision: 9 $</version>
// </file> // </file>
using System; using System;
@ -13,7 +13,7 @@ using System.Runtime.InteropServices;
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("Reflector.IpcServer")] [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 #if DEBUG
[assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyConfiguration("Debug")]
#else #else
@ -37,4 +37,4 @@ using System.Runtime.InteropServices;
// //
// You can specify all the values or you can use the default the Revision and // You can specify all the values or you can use the default the Revision and
// Build Numbers by using the '*' as shown below: // Build Numbers by using the '*' as shown below:
[assembly: AssemblyVersion("5.0.0.3")] [assembly: AssemblyVersion("5.0.1.9")]

8
src/AddIns/Misc/ReflectorAddIn/ReflectorIpcServer/src/Reflector.IpcServer/src/IReflectorService.cs

@ -20,6 +20,13 @@ namespace Reflector.IpcServer
/// <returns><c>true</c>.</returns> /// <returns><c>true</c>.</returns>
bool CheckIsThere(); bool CheckIsThere();
/// <summary>
/// Gets whether the Reflector service is ready to accept commands.
/// </summary>
bool IsReady {
get;
}
/// <summary> /// <summary>
/// Positions the assembly browser of Reflector on the element /// Positions the assembly browser of Reflector on the element
/// that best matches the parameters contained in the <paramref name="element"/> parameter /// that best matches the parameters contained in the <paramref name="element"/> parameter
@ -27,6 +34,7 @@ namespace Reflector.IpcServer
/// </summary> /// </summary>
/// <param name="element">A <see cref="CodeElementInfo"/> object that describes the element to go to.</param> /// <param name="element">A <see cref="CodeElementInfo"/> object that describes the element to go to.</param>
/// <exception cref="ArgumentNullException">The <paramref name="element"/> parameter is <c>null</c>.</exception> /// <exception cref="ArgumentNullException">The <paramref name="element"/> parameter is <c>null</c>.</exception>
/// <exception cref="InvalidOperationException">The service is not ready (the <see cref="IsReady"/> property is false).</exception>
void GoTo(CodeElementInfo element); void GoTo(CodeElementInfo element);
} }
} }

Loading…
Cancel
Save