public class Implementation : IServiceProvider { public override string ToString() { return "Awesome"; } public object GetService(Type serviceType) { return new object(); } }
public class AppDomainRunner : MarshalByRefObject, IDisposable { private AppDomain appDomain; private Assembly assembly; private AppDomainRunner remoteRunner; private void LoadAssembly(string assemblyPath) { assembly = Assembly.LoadFile(assemblyPath); } public AppDomainRunner(string assemblyPath) { // make appdomain appDomain = AppDomain.CreateDomain("PseudoIsolated", null, new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory }); // create object instance remoteRunner = (AppDomainRunner)appDomain.CreateInstanceAndUnwrap(typeof(AppDomainRunner).Assembly.FullName, typeof(AppDomainRunner).FullName); remoteRunner.LoadAssembly(assemblyPath); } public IntPtr CreateInstance(string typename) { return remoteRunner.CreateInstanceImpl(typename); } private IntPtr CreateInstanceImpl(string typename) { return EntityPtr.ToPointer(assembly.CreateInstance(typename)); } public void Dispose() { assembly = null; remoteRunner = null; AppDomain.Unload(appDomain); }
public class Container : IDisposable { private AppDomainRunner appdomain; private Dictionary<Type, Object> instances = new Dictionary<Type, object>(); public Container(string assemblyName) { appdomain = new AppDomainRunner(Path.Combine(System.Environment.CurrentDirectory, assemblyName)); } public void Register<TInterface>(string fullTypeName) { instances.Add(typeof (TInterface), EntityPtr.ToInstance<Object>(appdomain.CreateInstance(fullTypeName))); } public TInterface Resolve<TInterface>() { return (TInterface)(instances[typeof (TInterface)]); } public void Dispose() { appdomain.Dispose(); } }
static void Main(string[] args) { using (var container = new Container("library.dll")) { container.Register<IServiceProvider>("IocLibrary.Implementation"); var serviceProvider = container.Resolve<IServiceProvider>(); Console.WriteLine("calling method without proxy: {0}", serviceProvider); Console.WriteLine("Current domain assemblies: {0}", string.Join(", ", AppDomain.CurrentDomain.GetAssemblies().Select(asm => asm.GetName().Name).ToArray())); } }
Source: https://habr.com/ru/post/247491/
All Articles