diff options
author | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2014-11-20 02:42:01 +0300 |
---|---|---|
committer | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2014-11-20 02:42:01 +0300 |
commit | 1efa7956645fcb75a35fe141b003dfa76a78d042 (patch) | |
tree | e2d75de624d918f16f761577c0b248a2784e68b2 | |
parent | ecb7dd95e5c9f35ff84d04f7b3a70e1f4f8095e8 (diff) |
Make scan domain work in LoadFrom contextmono-addins-1.2
-rw-r--r-- | Mono.Addins/Mono.Addins.Database/SetupDomain.cs | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/Mono.Addins/Mono.Addins.Database/SetupDomain.cs b/Mono.Addins/Mono.Addins.Database/SetupDomain.cs index 44b44d6..8e3db85 100644 --- a/Mono.Addins/Mono.Addins.Database/SetupDomain.cs +++ b/Mono.Addins/Mono.Addins.Database/SetupDomain.cs @@ -62,13 +62,23 @@ namespace Mono.Addins.Database ReleaseDomain (); } } - + + // ensure types from this assembly returned to this domain from the remote domain can + // be resolved even if we're in the LoadFrom context + static System.Reflection.Assembly MonoAddinsAssemblyResolve(object sender, ResolveEventArgs args) + { + var asm = typeof(SetupDomain).Assembly; + return args.Name == asm.FullName? asm : null; + } + RemoteSetupDomain GetDomain () { lock (this) { if (useCount++ == 0) { + AppDomain.CurrentDomain.AssemblyResolve += MonoAddinsAssemblyResolve; domain = AppDomain.CreateDomain ("SetupDomain", null, AppDomain.CurrentDomain.SetupInformation); - remoteSetupDomain = (RemoteSetupDomain) domain.CreateInstanceFromAndUnwrap (typeof(RemoteSetupDomain).Assembly.Location, typeof(RemoteSetupDomain).FullName); + var type = typeof(RemoteSetupDomain); + remoteSetupDomain = (RemoteSetupDomain) domain.CreateInstanceFromAndUnwrap (type.Assembly.Location, type.FullName); } return remoteSetupDomain; } @@ -81,13 +91,24 @@ namespace Mono.Addins.Database AppDomain.Unload (domain); domain = null; remoteSetupDomain = null; + AppDomain.CurrentDomain.AssemblyResolve -= MonoAddinsAssemblyResolve; } } } } - + class RemoteSetupDomain: MarshalByRefObject { + public RemoteSetupDomain () + { + // ensure types from this assembly passed to this domain from the main domain + // can be resolved even though we're in the LoadFrom context + AppDomain.CurrentDomain.AssemblyResolve += (o, a) => { + var asm = typeof(RemoteSetupDomain).Assembly; + return a.Name == asm.FullName? asm : null; + }; + } + public override object InitializeLifetimeService () { return null; |