We make shipped assemblies: we interact between domains without marshalling
Getting a pointer to a .Net object
Manual stream cloning. When Assembler + C # or Java = Love
Changing the code of system assemblies or "leak". Net Framework 5.0
How does decompilation in .Net or Java using the example .Net
Continuing to shred CLR: .Net object pool outside SOH / LOH heaps
Remove objects dump from .Net application memory
DotNetExpublic 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