Browse Source

moving assembly loading to AppDomain

fix problems in EventHandlerProxies
formsdesignerappdomain
Siegfried Pammer 14 years ago
parent
commit
bbb25c5ad7
  1. 14
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs
  2. 3
      src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/SideTabDesigner.cs
  3. 49
      src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs
  4. 17
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/EventHandlerProxy.cs
  5. 36
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs
  6. 1
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/AssemblyInfo.cs

14
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs

@ -190,9 +190,9 @@ namespace ICSharpCode.FormsDesigner @@ -190,9 +190,9 @@ namespace ICSharpCode.FormsDesigner
throw new InvalidOperationException("Designer loading a source code file while DesignerLoader is loading and the view is not in a master load operation. This must not happen.");
}
if (appDomainHost.DesignSurfaceName != null) {
this.UnloadDesigner();
}
// if (appDomainHost.DesignSurfaceName != null) {
// this.UnloadDesigner();
// }
this.inMasterLoadOperation = true;
@ -567,7 +567,7 @@ namespace ICSharpCode.FormsDesigner @@ -567,7 +567,7 @@ namespace ICSharpCode.FormsDesigner
bool reloadPending;
bool unloading;
void DesignerLoaded(object sender, LoadedEventArgs e)
void DesignerLoaded(object sender, LoadedEventArgsProxy e)
{
// This method is called when the designer has loaded.
LoggingService.Debug("Forms designer: DesignerLoader loaded, HasSucceeded=" + e.HasSucceeded.ToString());
@ -978,12 +978,6 @@ namespace ICSharpCode.FormsDesigner @@ -978,12 +978,6 @@ namespace ICSharpCode.FormsDesigner
#endregion
public IDesignerGenerator Generator {
get {
return generator;
}
}
SharpDevelopDesignerOptions options;
public SharpDevelopDesignerOptions DesignerOptions {

3
src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/Toolbox/SideTabDesigner.cs

@ -49,8 +49,7 @@ namespace ICSharpCode.FormsDesigner.Gui @@ -49,8 +49,7 @@ namespace ICSharpCode.FormsDesigner.Gui
toolboxItem.TypeName = component.FullName;
toolboxItem.Bitmap = toolbox.ComponentLibraryLoader.GetIcon(component);
toolboxItem.DisplayName = component.Name;
Assembly asm = component.LoadAssembly();
toolboxItem.AssemblyName = asm.GetName();
toolboxItem.AssemblyName = toolbox.ComponentLibraryLoader.GetAssemblyName(component);
this.Items.Add(new SideTabItemDesigner(toolbox, toolboxItem));
}

49
src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs

@ -5,12 +5,14 @@ using System.AddIn.Contract; @@ -5,12 +5,14 @@ using System.AddIn.Contract;
using System.AddIn.Pipeline;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using ICSharpCode.FormsDesigner.Gui;
using ICSharpCode.FormsDesigner.Services;
namespace ICSharpCode.FormsDesigner
@ -24,6 +26,8 @@ namespace ICSharpCode.FormsDesigner @@ -24,6 +26,8 @@ namespace ICSharpCode.FormsDesigner
ServiceContainer container;
DesignerLoader loader;
IFormsDesignerLoggingService logger;
public string DesignSurfaceName {
get {
return (designSurface == null) ? null : designSurface.ToString();
@ -77,7 +81,8 @@ namespace ICSharpCode.FormsDesigner @@ -77,7 +81,8 @@ namespace ICSharpCode.FormsDesigner
void Initialize(FormsDesignerAppDomainCreationProperties properties)
{
this.container = new DefaultServiceContainer();
container.AddService(typeof(IFormsDesignerLoggingService), properties.Logger);
container.AddService(typeof(FormsDesignerAppDomainHost), this);
container.AddService(typeof(IFormsDesignerLoggingService), logger = properties.Logger);
container.AddService(typeof(System.Drawing.Design.IPropertyValueUIService), new PropertyValueUIService());
container.AddService(typeof(ITypeResolutionService), new TypeResolutionService(properties.FileName, container, properties.TypeLocator));
container.AddService(typeof(ITypeDiscoveryService), new TypeDiscoveryService(properties.GacWrapper, container));
@ -104,15 +109,16 @@ namespace ICSharpCode.FormsDesigner @@ -104,15 +109,16 @@ namespace ICSharpCode.FormsDesigner
}
}
public event LoadedEventHandler DesignSurfaceLoaded;
public event EventHandler<LoadedEventArgsProxy> DesignSurfaceLoaded;
protected virtual void OnDesignSurfaceLoaded(LoadedEventArgs e)
{
if (DesignSurfaceLoaded != null) {
DesignSurfaceLoaded(this, e);
DesignSurfaceLoaded(this, new LoadedEventArgsProxy { HasSucceeded = e.HasSucceeded });
}
}
public event EventHandler DesignSurfaceFlushed;
protected virtual void OnDesignSurfaceFlushed(EventArgs e)
@ -351,6 +357,43 @@ namespace ICSharpCode.FormsDesigner @@ -351,6 +357,43 @@ namespace ICSharpCode.FormsDesigner
{
Services.AddService(type, service);
}
public Bitmap LoadComponentIcon(ToolComponent component)
{
Assembly asm = component.LoadAssembly();
Type type = asm.GetType(component.FullName);
Bitmap b = null;
if (type != null) {
object[] attributes = type.GetCustomAttributes(false);
foreach (object attr in attributes) {
if (attr is ToolboxBitmapAttribute) {
ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr;
b = new Bitmap(toolboxBitmapAttribute.GetImage(type));
b.MakeTransparent();
break;
}
}
}
if (b == null) {
try {
Stream imageStream = asm.GetManifestResourceStream(component.FullName + ".bmp");
if (imageStream != null) {
b = new Bitmap(Image.FromStream(imageStream));
b.MakeTransparent();
}
} catch (Exception e) {
logger.Warn("ComponentLibraryLoader.GetIcon: " + e.Message);
}
}
// TODO: Maybe default icon needed ??!?!
return b;
}
public AssemblyName GetAssemblyName(ToolComponent component)
{
return component.LoadAssembly().GetName();
}
}
public class FormsDesignerAppDomainCreationProperties : MarshalByRefObject

17
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/EventHandlerProxy.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel.Design;
using System.Runtime.InteropServices;
namespace ICSharpCode.FormsDesigner
{
@ -27,23 +28,29 @@ namespace ICSharpCode.FormsDesigner @@ -27,23 +28,29 @@ namespace ICSharpCode.FormsDesigner
}
}
[Serializable]
public class LoadedEventArgsProxy : EventArgs
{
public bool HasSucceeded { get; set; }
}
public class LoadedEventHandlerProxy : MarshalByRefObject
{
LoadedEventHandler underlyingHandler;
LoadedEventHandler proxyHandler;
EventHandler<LoadedEventArgsProxy> underlyingHandler;
EventHandler<LoadedEventArgsProxy> proxyHandler;
public LoadedEventHandlerProxy(LoadedEventHandler underlyingHandler)
public LoadedEventHandlerProxy(EventHandler<LoadedEventArgsProxy> underlyingHandler)
{
this.underlyingHandler = underlyingHandler;
this.proxyHandler = OnEvent;
}
void OnEvent(object sender, LoadedEventArgs e)
void OnEvent(object sender, LoadedEventArgsProxy e)
{
underlyingHandler(sender, e);
}
public static implicit operator LoadedEventHandler(LoadedEventHandlerProxy proxy)
public static implicit operator EventHandler<LoadedEventArgsProxy>(LoadedEventHandlerProxy proxy)
{
return proxy.proxyHandler;
}

36
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs

@ -225,11 +225,13 @@ namespace ICSharpCode.FormsDesigner.Gui @@ -225,11 +225,13 @@ namespace ICSharpCode.FormsDesigner.Gui
IServiceProvider provider;
IFormsDesignerLoggingService logger;
FormsDesignerAppDomainHost appDomainHost;
public ComponentLibraryLoader(IServiceProvider provider)
{
this.provider = provider;
logger = (IFormsDesignerLoggingService)provider.GetService(typeof(IFormsDesignerLoggingService));
appDomainHost = (FormsDesignerAppDomainHost)provider.GetService(typeof(FormsDesignerAppDomainHost));
}
public ArrayList Categories {
@ -351,34 +353,7 @@ namespace ICSharpCode.FormsDesigner.Gui @@ -351,34 +353,7 @@ namespace ICSharpCode.FormsDesigner.Gui
public Bitmap GetIcon(ToolComponent component)
{
Assembly asm = component.LoadAssembly();
Type type = asm.GetType(component.FullName);
Bitmap b = null;
if (type != null) {
object[] attributes = type.GetCustomAttributes(false);
foreach (object attr in attributes) {
if (attr is ToolboxBitmapAttribute) {
ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr;
b = new Bitmap(toolboxBitmapAttribute.GetImage(type));
b.MakeTransparent();
break;
}
}
}
if (b == null) {
try {
Stream imageStream = asm.GetManifestResourceStream(component.FullName + ".bmp");
if (imageStream != null) {
b = new Bitmap(Image.FromStream(imageStream));
b.MakeTransparent();
}
} catch (Exception e) {
logger.Warn("ComponentLibraryLoader.GetIcon: " + e.Message);
}
}
// TODO: Maybe default icon needed ??!?!
return b;
return appDomainHost.LoadComponentIcon(component);
}
public ToolComponent GetToolComponent(string assemblyName)
@ -455,5 +430,10 @@ namespace ICSharpCode.FormsDesigner.Gui @@ -455,5 +430,10 @@ namespace ICSharpCode.FormsDesigner.Gui
}
return true;
}
public AssemblyName GetAssemblyName(ToolComponent component)
{
return appDomainHost.GetAssemblyName(component);
}
}
}

1
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/AssemblyInfo.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
namespace ICSharpCode.FormsDesigner.Services
{
[Serializable]
public struct AssemblyInfo : IEquatable<AssemblyInfo>
{
public static readonly AssemblyInfo Empty = new AssemblyInfo("", "", false);

Loading…
Cancel
Save