/// <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); }
//===================================================================== /// <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); } } }