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 @@ @@ -1,7 +1,7 @@
<AddIn name = "ReflectorAddIn"
author = "Christian Hornung"
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>
<Identity name="ReflectorAddIn" />

25
src/AddIns/Misc/ReflectorAddIn/ReflectorAddIn/Project/Src/ReflectorController.cs

@ -13,6 +13,8 @@ using System.Runtime.Remoting; @@ -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; @@ -21,13 +23,13 @@ using Reflector.IpcServer;
namespace ReflectorAddIn
{
/// <summary>
/// Controls Lutz Roeders's .NET Reflector.
/// Controls .NET Reflector.
/// </summary>
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 @@ -56,7 +58,7 @@ namespace ReflectorAddIn
/// Ensures that an instance of Reflector is running and connects to it.
/// </summary>
/// <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;
try {
@ -157,7 +159,7 @@ namespace ReflectorAddIn @@ -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 @@ -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);

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

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version>
// <version>$Revision: 9 $</version>
// </file>
using System;
@ -13,7 +13,7 @@ using System.Runtime.InteropServices; @@ -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; @@ -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")]

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

@ -16,15 +16,24 @@ namespace Reflector.IpcServer.AddIn @@ -16,15 +16,24 @@ namespace Reflector.IpcServer.AddIn
/// <summary>
/// Provides the ability to remote-control Reflector.
/// </summary>
public sealed class ReflectorService : MarshalByRefObject, IReflectorService
public sealed class ReflectorService : MarshalByRefObject, IReflectorService, IDisposable
{
readonly IServiceProvider serviceProvider;
readonly Dictionary<string, DateTime> assemblyLastWriteTimes = new Dictionary<string, DateTime>(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();
}
/// <summary>
@ -37,6 +46,18 @@ namespace Reflector.IpcServer.AddIn @@ -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<T>()
@ -66,6 +87,7 @@ namespace Reflector.IpcServer.AddIn @@ -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<CodeElementInfo>(GoToInternal),
new object[] { element });
}
@ -97,6 +119,9 @@ namespace Reflector.IpcServer.AddIn @@ -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;
}

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

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

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

@ -1,7 +1,7 @@ @@ -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 @@ -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

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

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version>
// <version>$Revision: 9 $</version>
// </file>
using System;
@ -13,7 +13,7 @@ using System.Runtime.InteropServices; @@ -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; @@ -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")]

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

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

Loading…
Cancel
Save