/// <summary> /// Adds a binding to the configuration for the specified assembly. /// </summary> /// <remarks> /// <para> /// Depending on how the binding is configured, this method will add an assembly dependency /// record and possibly an assembly qualification record. /// </para> /// </remarks> /// <param name="assemblyBinding">The assembly binding.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="assemblyBinding"/> is null.</exception> public void AddAssemblyBinding(AssemblyBinding assemblyBinding) { if (assemblyBinding == null) { throw new ArgumentNullException("assemblyBinding"); } AssemblyName assemblyName = assemblyBinding.AssemblyName; byte[] publicKeyTokenBytes = assemblyName.GetPublicKeyToken(); string publicKeyToken = publicKeyTokenBytes != null && publicKeyTokenBytes.Length != 0 ? ToHex(publicKeyTokenBytes) : null; if (assemblyBinding.QualifyPartialName && publicKeyToken != null) { AddAssemblyQualification(assemblyName.Name, assemblyName.FullName); } AssemblyDependency assemblyDependency = AddAssemblyDependency( assemblyName.Name, publicKeyToken, AssemblyUtils.GetAssemblyNameCulture(assemblyName), GetProcessorArchitectureName(assemblyName.ProcessorArchitecture)); foreach (AssemblyBinding.BindingRedirect bindingRedirect in assemblyBinding.BindingRedirects) { assemblyDependency.AddAssemblyBindingRedirect(bindingRedirect.OldVersion, assemblyName.Version.ToString()); } // Note: If unsigned assembly appears outside of appbase then we get an exception: // "The private assembly was located outside the appbase directory." if (assemblyBinding.CodeBase != null && publicKeyToken != null) { assemblyDependency.AddAssemblyCodeBase(assemblyName.Version.ToString(), assemblyBinding.CodeBase.ToString()); } assemblyDependency.ApplyPublisherPolicy = assemblyBinding.ApplyPublisherPolicy; }