public void Constructor_WhenAssemblyNotNull_InitializesProperties()
        {
            var assembly = GetType().Assembly;

            var assemblyReference = new AssemblyBinding(assembly);

            Assert.Multiple(() =>
            {
                Assert.AreEqual(assembly.GetName().FullName, assemblyReference.AssemblyName.FullName);
                Assert.AreEqual(assembly.CodeBase, assemblyReference.CodeBase.ToString());
                Assert.IsFalse(assemblyReference.QualifyPartialName);
                Assert.IsEmpty(assemblyReference.BindingRedirects);
                Assert.IsTrue(assemblyReference.ApplyPublisherPolicy);
            });
        }
        public void Constructor_WhenAssemblyNameNotNull_InitializesProperties()
        {
            var assemblyName = new AssemblyName("Gallio");

            var assemblyReference = new AssemblyBinding(assemblyName);

            Assert.Multiple(() =>
            {
                Assert.AreSame(assemblyName, assemblyReference.AssemblyName);
                Assert.IsNull(assemblyReference.CodeBase);
                Assert.IsFalse(assemblyReference.QualifyPartialName);
                Assert.IsEmpty(assemblyReference.BindingRedirects);
                Assert.IsTrue(assemblyReference.ApplyPublisherPolicy);
            });
        }
        /// <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;
        }
Esempio n. 4
0
        private static IList<IPluginDescriptor> RegisterPlugins(IRegistry registry, IList<PluginData> topologicallySortedPlugins)
        {
            IPluginDescriptor[] pluginDescriptors = new IPluginDescriptor[topologicallySortedPlugins.Count];
            for (int i = 0; i < topologicallySortedPlugins.Count; i++)
            {
                Plugin plugin = topologicallySortedPlugins[i].Plugin;
                DirectoryInfo baseDirectory = topologicallySortedPlugins[i].BaseDirectory;

                try
                {
                    var pluginType = plugin.PluginType != null
                        ? new TypeName(plugin.PluginType)
                        : new TypeName(typeof(DefaultPlugin));

                    List<string> disabledReasons = new List<string>();

                    var pluginRegistration = new PluginRegistration(plugin.PluginId,
                        pluginType, baseDirectory);
                    if (plugin.Parameters != null)
                        pluginRegistration.PluginProperties = plugin.Parameters.PropertySet;
                    if (plugin.Traits != null)
                        pluginRegistration.TraitsProperties = plugin.Traits.PropertySet;

                    pluginRegistration.ProbingPaths = plugin.ProbingPaths;
                    pluginRegistration.RecommendedInstallationPath = plugin.RecommendedInstallationPath;

                    if (plugin.EnableCondition != null)
                        pluginRegistration.EnableCondition = Condition.Parse(plugin.EnableCondition);

                    foreach (var file in plugin.Files)
                        pluginRegistration.FilePaths.Add(file.Path);

                    foreach (var dependency in plugin.Dependencies)
                    {
                        string pluginDependencyId = dependency.PluginId;

                        IPluginDescriptor pluginDependency = registry.Plugins[pluginDependencyId];
                        if (pluginDependency == null)
                        {
                            disabledReasons.Add(string.Format("Could not find plugin '{0}' upon which this plugin depends.", pluginDependencyId));
                        }
                        else
                        {
                            pluginRegistration.PluginDependencies.Add(pluginDependency);
                        }
                    }

                    foreach (var assembly in plugin.Assemblies)
                    {
                        Uri absoluteCodeBase;
                        if (assembly.CodeBase != null)
                        {
                            List<string> attemptedPaths = new List<string>();
                            string foundCodeBasePath = ProbeForCodeBase(baseDirectory, plugin.ProbingPaths, assembly.CodeBase, attemptedPaths);
                            if (foundCodeBasePath == null)
                            {
                                StringBuilder formattedPaths = new StringBuilder();
                                foreach (string path in attemptedPaths)
                                {
                                    if (formattedPaths.Length != 0)
                                        formattedPaths.Append(", ");
                                    formattedPaths.Append("'").Append(path).Append("'");
                                }

                                disabledReasons.Add(string.Format("Could not find assembly '{0}' after probing for its code base in {1}.",
                                    assembly.FullName, formattedPaths));
                                absoluteCodeBase = null;
                            }
                            else
                            {
                                absoluteCodeBase = new Uri(foundCodeBasePath);
                            }
                        }
                        else
                        {
            #if STRICT_GAC_CHECKS
                            if (!IsAssemblyRegisteredInGAC(assembly.FullName))
                            {
                                disabledReasons.Add(
                                    string.Format("Could not find assembly '{0}' in the global assembly cache.",
                                        assembly.FullName));
                            }
            #endif

                            absoluteCodeBase = null;
                        }

                        var assemblyBinding = new AssemblyBinding(new AssemblyName(assembly.FullName))
                        {
                            CodeBase = absoluteCodeBase,
                            QualifyPartialName = assembly.QualifyPartialName,
                            ApplyPublisherPolicy = assembly.ApplyPublisherPolicy
                        };

                        foreach (BindingRedirect redirect in assembly.BindingRedirects)
                            assemblyBinding.AddBindingRedirect(new AssemblyBinding.BindingRedirect(redirect.OldVersion));

                        pluginRegistration.AssemblyBindings.Add(assemblyBinding);
                    }

                    IPluginDescriptor pluginDescriptor = registry.RegisterPlugin(pluginRegistration);
                    pluginDescriptors[i] = pluginDescriptor;

                    if (disabledReasons.Count != 0)
                        pluginDescriptor.Disable(disabledReasons[0]);
                }
                catch (Exception ex)
                {
                    throw new RuntimeException(string.Format("Could not register plugin '{0}'.",
                        plugin.PluginId), ex);
                }
            }
            return pluginDescriptors;
        }
        public void CodeBase_WhenCodeBaseIsAnAbsoluteUri_InitializesPropertyToUri()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));
            var codeBase = new Uri("file:///c:/foo.dll");

            binding.CodeBase = codeBase;

            Assert.AreEqual(codeBase, binding.CodeBase);
        }
        public void CodeBase_WhenCodeBaseIsNull_InitializesPropertyToNull()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            binding.CodeBase = null;

            Assert.IsNull(binding.CodeBase);
        }
        public void CodeBase_WhenCodeBaseIsNotAnAbsoluteUri_Throws()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            Assert.Throws<ArgumentException>(() => binding.CodeBase = new Uri("bar/foo.dll", UriKind.Relative));
        }
        public void AddBindingRedirect_WhenBindingRedirectIsNotNull_AddsTheRedirect()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            binding.AddBindingRedirect(new AssemblyBinding.BindingRedirect("1.2.3.4"));

            Assert.AreElementsEqual(new[] { new AssemblyBinding.BindingRedirect("1.2.3.4") },
                binding.BindingRedirects,
                (x, y) => x.OldVersion == y.OldVersion);
        }
        public void AddBindingRedirect_WhenBindingRedirectIsNull_Throws()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            Assert.Throws<ArgumentNullException>(() => binding.AddBindingRedirect(null));
        }
        public void ApplyPublisherPolicy_CanGetSet()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            binding.ApplyPublisherPolicy = true;
            Assert.IsTrue(binding.ApplyPublisherPolicy);

            binding.ApplyPublisherPolicy = false;
            Assert.IsFalse(binding.ApplyPublisherPolicy);
        }
        public void QualifyPartialName_CanGetSet()
        {
            var binding = new AssemblyBinding(new AssemblyName("Gallio"));

            binding.QualifyPartialName = true;
            Assert.IsTrue(binding.QualifyPartialName);

            binding.QualifyPartialName = false;
            Assert.IsFalse(binding.QualifyPartialName);
        }