コード例 #1
0
        /// <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;
        }