Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-addins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hutchinson <m.j.hutchinson@gmail.com>2014-11-20 02:42:01 +0300
committerMichael Hutchinson <m.j.hutchinson@gmail.com>2014-11-20 02:42:01 +0300
commit1efa7956645fcb75a35fe141b003dfa76a78d042 (patch)
treee2d75de624d918f16f761577c0b248a2784e68b2
parentecb7dd95e5c9f35ff84d04f7b3a70e1f4f8095e8 (diff)
Make scan domain work in LoadFrom contextmono-addins-1.2
-rw-r--r--Mono.Addins/Mono.Addins.Database/SetupDomain.cs27
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;