예제 #1
0
        public static void RefreshAllBundles(IBundleContext context)
        {
            // parse each folders to register new bundles
            foreach (var folderPath in Directory.GetDirectories(Path.GetFullPath(string.Format("Bundles"))))
            {
                var bundleName = new DirectoryInfo(folderPath).Name;
                var bundleInfo = context.GetBundle(bundleName);
                if (bundleInfo == null)
                {
                    string path = Path.GetFullPath(string.Format("Bundles\\{0}\\{0}.dll", bundleName));

                    // the assembly doesn't exist, try the bundle.config? Web.config?
                    if (!File.Exists(path))
                    {
                        System.Configuration.Configuration configuration = null;

                        if (File.Exists(Path.GetFullPath(string.Format("Bundles\\{0}\\{0}.dll.config", bundleName))))
                        {
                            configuration = ConfigurationManager.OpenExeConfiguration(path);
                        }
                        else if (File.Exists(Path.GetFullPath(string.Format("Bundles\\{0}\\web.config", bundleName))))
                        {
                            VirtualDirectoryMapping vdm =
                                new VirtualDirectoryMapping(
                                    Path.GetFullPath(string.Format("Bundles\\{0}", bundleName)), true);
                            WebConfigurationFileMap wcfm = new WebConfigurationFileMap();
                            wcfm.VirtualDirectories.Add("/", vdm);

                            // Get the Web application configuration object.
                            configuration = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
                        }
                        else
                        {
                            throw new BundleNotFoundException(bundleName, new Version());
                        }

                        // TODO : better error handling
                        var section = (BundleConfigurationSection) configuration.GetSection("bundleConfiguration");

                        path = Path.GetFullPath(string.Format("Bundles\\{0}\\{1}", bundleName, section.BundlePath));
                        if (!File.Exists(path))
                            throw new BundleNotFoundException(bundleName, new Version());
                    }

                    // create the bundle with all information needed
                    var assembly = Assembly.ReflectionOnlyLoadFrom(path);
                    var version = assembly.GetName().Version;
                    bundleInfo = new BundleInfo
                    {
                        Path = path,
                        Name = bundleName,
                        Version = assembly.GetName().Version,
                        State = BundleState.Installed
                    };

                    // and then, register it
                    context.RegisterBundle(bundleInfo);
                }
            }
        }
예제 #2
0
        public static void Start(IBundleContext context, string bundleName)
        {
            // load all installed bundle
            RefreshAllBundles(context);

            // TODO : handle installation of new bundle?
            var bundleInfo = context.GetBundle(bundleName);
            if(bundleInfo == null)
                throw new BundleNotFoundException(bundleName, null);

            if (bundleInfo.State == BundleState.Active)
            {
                logger.InfoFormat("Application {0} already loaded", bundleName);
                return;
            }

            AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
            setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            ApplicationIdentity identity = new ApplicationIdentity(bundleInfo.Name);
            //setup.ActivationArguments = new ActivationArguments(identity, new string[] { p });
            setup.ApplicationName = bundleInfo.Path;

            setup.AppDomainInitializer = null;
            //setup.AppDomainInitializer = new AppDomainInitializer(Initialize);
            //setup.AppDomainInitializerArguments = new string[]{ path };

            List<string> paths = new List<string>();
            paths.Add(Path.GetDirectoryName(bundleInfo.Path));
            paths.Add(Path.Combine(setup.ApplicationBase, "Libs"));
            paths.AddRange(Directory.GetDirectories(Path.Combine(setup.ApplicationBase, "Libs")));
            setup.PrivateBinPath = string.Join(";", paths.ToArray());

            var dom = AppDomain.CreateDomain(bundleInfo.Path, AppDomain.CurrentDomain.Evidence, setup);

            dom.ProcessExit += new EventHandler(dom_ProcessExit);
            dom.DomainUnload += new EventHandler(dom_DomainUnload);
            dom.UnhandledException += new UnhandledExceptionEventHandler(dom_UnhandledException);

            bundleInfo.Boostrap = (BundleController)dom.CreateInstanceAndUnwrap(typeof(BundleController).Assembly.FullName, typeof(BundleController).FullName);
            bundleInfo.AppDomain = dom;

            bundleInfo.State = BundleState.Resolved;
            context.RegisterBundle(bundleInfo);

            bundleInfo.Boostrap.StartActivator(context);
        }