예제 #1
0
        /// <summary>
        /// Load assembly binding redirects from a configuration file.
        /// </summary>
        /// <param name="configFile">The configuration filename</param>
        /// <returns>A collection containing the assembly binding redirects</returns>
        public static Collection <BindingRedirectSettings> FromConfigFile(
            string configFile)
        {
            XmlNamespaceManager nsm;
            XmlDocument         config;
            XPathNavigator      navConfig;

            Collection <BindingRedirectSettings> redirects =
                new Collection <BindingRedirectSettings>();

            config = new XmlDocument();
            config.Load(configFile);
            nsm = new XmlNamespaceManager(config.NameTable);
            nsm.AddNamespace("binding", "urn:schemas-microsoft-com:asm.v1");

            navConfig = config.CreateNavigator();

            foreach (XPathNavigator nav in navConfig.Select("configuration/" +
                                                            "runtime/binding:assemblyBinding/binding:dependentAssembly", nsm))
            {
                redirects.Add(BindingRedirectSettings.FromXPathNavigator(
                                  nav, nsm, "binding"));
            }

            return(redirects);
        }
예제 #2
0
        //=====================================================================

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="configuration">The configuration navigator</param>
        public BindingRedirectResolver(XPathNavigator configuration) :
            base(configuration)
        {
            Collection <BindingRedirectSettings> importedSettings;
            BindingRedirectSettings brs;
            Type type;

            System.Reflection.FieldInfo field;

            Assembly        asm = Assembly.GetExecutingAssembly();
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location);

            // Log the use of the resolver in case it crashes
            ConsoleApplication.WriteMessage(LogLevel.Info, String.Format(
                                                CultureInfo.InvariantCulture, "\r\n[{0}, version {1}]\r\n" +
                                                "Binding Redirect Assembly Resolver Component.\r\n{2}\r\n" +
                                                "http://SHFB.CodePlex.com", fvi.ProductName,
                                                fvi.ProductVersion, fvi.LegalCopyright));

            // Unfortunately, the base class doesn't expose its cache so we
            // have to use Reflection to get at it.
            type  = this.GetType().BaseType;
            field = type.GetField("cache", System.Reflection.BindingFlags.NonPublic |
                                  System.Reflection.BindingFlags.Instance);
            cache = (Dictionary <string, AssemblyNode>)field.GetValue(this);

            // Load assembly binding redirects
            redirects = new Collection <BindingRedirectSettings>();

            foreach (XPathNavigator nav in configuration.Select(
                         "assemblyBinding/dependentAssembly"))
            {
                brs = BindingRedirectSettings.FromXPathNavigator(nav, null, null);

                // Import settings from a configuration file?
                if (!String.IsNullOrEmpty(brs.ConfigurationFile))
                {
                    importedSettings = BindingRedirectSettings.FromConfigFile(
                        brs.ConfigurationFile);

                    foreach (BindingRedirectSettings imported in importedSettings)
                    {
                        ConsoleApplication.WriteMessage(LogLevel.Info,
                                                        imported.ToString());
                        redirects.Add(imported);
                    }
                }
                else
                {
                    ConsoleApplication.WriteMessage(LogLevel.Info, brs.ToString());
                    redirects.Add(brs);
                }
            }
        }