private void CheckLoadAssemblyIntoCache(ProxyCreator creator)
        {
            var savedScope = new ModuleScope(true);
            var builder    = new DefaultProxyBuilder(savedScope);

            var cp = creator(builder);

            Assert.AreSame(cp, creator(builder));

            var path = savedScope.SaveAssembly();

            CrossAppDomainCaller.RunInOtherAppDomain(delegate(object[] args)
            {
                var newScope   = new ModuleScope(false);
                var newBuilder = new DefaultProxyBuilder(newScope);

                var assembly = Assembly.LoadFrom((string)args[0]);
                newScope.LoadAssemblyIntoCache(assembly);

                var loadedCP = assembly.GetType((string)args[1]);
                Assert.AreSame(loadedCP, ((ProxyCreator)args[2])(newBuilder));
                Assert.AreEqual(assembly, ((ProxyCreator)args[2])(newBuilder).Assembly);
            }, path, cp.FullName, creator);

            File.Delete(path);
        }
        public void CacheMappingsHoldTypes()
        {
            var scope   = new ModuleScope(true);
            var builder = new DefaultProxyBuilder(scope);
            var cp      = builder.CreateClassProxyType(typeof(object), Type.EmptyTypes, ProxyGenerationOptions.Default);

            var savedPath = scope.SaveAssembly();

            CrossAppDomainCaller.RunInOtherAppDomain(delegate(object[] args)
            {
                var assembly  = Assembly.LoadFrom((string)args[0]);
                var attribute =
                    (CacheMappingsAttribute)
                    assembly.GetCustomAttributes(typeof(CacheMappingsAttribute), false)[0];
                var entries = attribute.GetDeserializedMappings();
                Assert.AreEqual(1, entries.Count);

                var key = new CacheKey(typeof(object), new Type[0],
                                       ProxyGenerationOptions.Default);
                Assert.IsTrue(entries.ContainsKey(key));
                Assert.AreEqual(args[1], entries[key]);
            },
                                                     savedPath, cp.FullName);

            File.Delete(savedPath);
        }
Exemplo n.º 3
0
        public static void RunInOtherAppDomain(Action <object[]> callback, params object[] args)
        {
            var callbackObject = new CrossAppDomainCaller(callback, args);
            var newDomain      = AppDomain.CreateDomain("otherDomain", AppDomain.CurrentDomain.Evidence,
                                                        AppDomain.CurrentDomain.SetupInformation);

            try
            {
                newDomain.DoCallBack(callbackObject.Run);
            }
            finally
            {
                AppDomain.Unload(newDomain);
            }
        }
        public void SavedAssemblyHasCacheMappings()
        {
            var scope = new ModuleScope(true);

            scope.ObtainDynamicModuleWithWeakName();

            var savedPath = scope.SaveAssembly();

            CrossAppDomainCaller.RunInOtherAppDomain(delegate(object[] args)
            {
                var assembly = Assembly.LoadFrom((string)args[0]);
                Assert.IsTrue(assembly.IsDefined(typeof(CacheMappingsAttribute), false));
            },
                                                     savedPath);

            File.Delete(savedPath);
        }
        public void LoadAssemblyIntoCache_DifferentGenerationOptions()
        {
            var savedScope = new ModuleScope(true);
            var builder    = new DefaultProxyBuilder(savedScope);

            var options1 = new ProxyGenerationOptions();

            options1.AddMixinInstance(new DateTime());
            var options2 = ProxyGenerationOptions.Default;

            var cp1 = builder.CreateClassProxyType(typeof(object), Type.EmptyTypes, options1);
            var cp2 = builder.CreateClassProxyType(typeof(object), Type.EmptyTypes, options2);

            Assert.AreNotSame(cp1, cp2);
            Assert.AreSame(cp1, builder.CreateClassProxyType(typeof(object), Type.EmptyTypes, options1));
            Assert.AreSame(cp2, builder.CreateClassProxyType(typeof(object), Type.EmptyTypes, options2));

            var path = savedScope.SaveAssembly();

            CrossAppDomainCaller.RunInOtherAppDomain(delegate(object[] args)
            {
                var newScope   = new ModuleScope(false);
                var newBuilder = new DefaultProxyBuilder(newScope);

                var assembly = Assembly.LoadFrom((string)args[0]);
                newScope.LoadAssemblyIntoCache(assembly);

                var newOptions1 = new ProxyGenerationOptions();
                newOptions1.AddMixinInstance(new DateTime());
                var newOptions2 = ProxyGenerationOptions.Default;

                var loadedCP1 = newBuilder.CreateClassProxyType(typeof(object),
                                                                Type.EmptyTypes,
                                                                newOptions1);
                var loadedCP2 = newBuilder.CreateClassProxyType(typeof(object),
                                                                Type.EmptyTypes,
                                                                newOptions2);
                Assert.AreNotSame(loadedCP1, loadedCP2);
                Assert.AreEqual(assembly, loadedCP1.Assembly);
                Assert.AreEqual(assembly, loadedCP2.Assembly);
            }, path);

            File.Delete(path);
        }