public void when_non_existant_directory_on_disk()
        {
            var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>("C:\\Foo\\Bar.dll");

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
Пример #2
0
        public static IEnumerable <IWrapper> LoadDynamicWrapper(string assemblyPath)
        {
            lock (_loadDynamicWrapperLockObj)
            {
                if (!_dynamicLoadAssemblyStatus.TryGetValue(assemblyPath.ToLower(), out var wrappers))
                {
                    var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IWrapper>(assemblyPath);

                    foreach (var ex in result.Exceptions)
                    {
                        Log.Warn($"An exception occurred while loading an extension from assembly {assemblyPath}: {ex}");
                    }

                    wrappers = result.Instances.ToArray();

                    _dynamicLoadAssemblyStatus[assemblyPath.ToLower()] = wrappers;

                    if (Log.IsFinestEnabled)
                    {
                        Log.Finest($"Dynamically loaded wrappers from assembly {assemblyPath}: {string.Join(", ", (IEnumerable<IWrapper>)wrappers)}");
                    }
                }

                return(wrappers);
            }
        }
        public void when_null_assemblies()
        {
            var result = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(null);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_invalid_path()
        {
            var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>("!@#$%");

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_type_load_exception()
        {
            var directory = MakeTempDirForTest();

            Action <string> testMethod1 = directoryPath =>
            {
                var interfaceAssemblyPath = Path.Combine(directoryPath, "IDoSomething.dll");
                var interfaceAssembly     = GenerateAssembly(@"public interface IDoSomething : IInterface { }", interfaceAssemblyPath);

                var concreteAssemblyPath = Path.Combine(directoryPath, "DoNothing.dll");
                GenerateAssembly(@"public class DoNothing : IDoSomething { }", concreteAssemblyPath, additionalAssemblyReferences: new[] { interfaceAssembly });
            };

            AppDomainExtensions.IsolateMethodInAppDomain(testMethod1, directory.FullName);

            Action <string> testMethod2 = directoryPath =>
            {
                // Add a method to IDoSomething so that our DoNothing class is no longer a valid implementation and will throw a TypeLoadException when loaded
                var interfaceAssemblyPath = Path.Combine(directoryPath, "IDoSomething.dll");
                GenerateAssembly(@"public interface IDoSomething : IInterface { void DoSomething(); }", interfaceAssemblyPath);

                var files = Directory.GetFiles(directoryPath);

                var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>(files);
                Assert.AreEqual(0, result.Instances.Count());
                Assert.AreEqual(1, result.Exceptions.Count());
            };

            AppDomainExtensions.IsolateMethodInAppDomain(testMethod2, directory.FullName);
            directory.Delete(true);
        }
        public void when_null_directory()
        {
            var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>((string)null);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_no_assemblies()
        {
            var assemblies = new Assembly[] {};
            var result     = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_null_type()
        {
            var types  = new Type[] { null };
            var result = TypeInstantiator.InstancesFromTypes <IInterface>(types);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_multiple_interfaces()
        {
            var assembly   = GenerateAssembly(@"public class Foo : IInterface, IInterface2 {}");
            var assemblies = new[] { assembly };
            var result     = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(1, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_empty_assembly()
        {
            var assembly   = GenerateAssembly(@"");
            var assemblies = new[] { assembly };
            var result     = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void when_constructor_throws_an_exception()
        {
            var assembly   = GenerateAssembly(@"public class Foo : IInterface { public Foo() { throw new System.Exception(); } }");
            var assemblies = new[] { assembly };

            var result = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(0, result.Instances.Count());
            Assert.AreEqual(1, result.Exceptions.Count());
        }
        public void when_is_derived()
        {
            var assembly = GenerateAssembly(
                @"public class Foo : IInterface {}
public class Bar : Foo {}");
            var assemblies = new[] { assembly };
            var result     = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(2, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
        public void ShouldNotLoadPrivateNestedClass()
        {
            var assemblies = new[]
            {
                GenerateAssembly(@"public class Foo : IInterface {}"),
                GenerateAssembly(@"public class Foo { private class Bar : IInterface {} }"),
            };
            var result = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(1, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
Пример #14
0
        private void LoadMenuItems()
        {
            for (var i = 0; i < menuItemCount; i++)
            {
                actionButtons[i].Visible = false;
                actionButtons[i].Text    = string.Empty;

                if (actionButtons[i] is ImageButton)
                {
                    if (((ImageButton)actionButtons[i]).Image != null)
                    {
                        ((ImageButton)actionButtons[i]).Image.Dispose();
                    }
                }
            }

            if (list.Count < menuItemCount)
            {
                for (var i = 0; i < list.Count; i++)
                {
                    actionButtons[i].Visible = true;
                    actionButtons[i].Text    = list[i].Text;

                    SetImage(i, i);

                    if (!string.IsNullOrEmpty(list[i].Action))
                    {
                        actionButtons[i].Tag = TypeInstantiator <IAction> .LoadType(list[i].Action);
                    }
                }
            }
            else
            {
                for (var i = currentPosition; i < currentPosition + menuItemCount && i < list.Count; i++)
                {
                    actionButtons[i - currentPosition].Visible = true;
                    actionButtons[i - currentPosition].Text    = list[i].Text;

                    SetImage(i - currentPosition, i);

                    if (!string.IsNullOrEmpty(list[i].Action))
                    {
                        actionButtons[i - currentPosition].Tag = TypeInstantiator <IAction> .LoadType(list[i].Action);
                    }
                }
            }

            if (list.Count > menuItemCount)
            {
                navButton.Visible = true;
            }
        }
        public void when_nested_class()
        {
            var assemblies = new[]
            {
                GenerateAssembly(@"public class Foo : IInterface {}"),
                GenerateAssembly(@"public class Foo { public class Bar : IInterface {} }"),
            };

            var result = TypeInstantiator.ExportedInstancesFromAssemblies <IInterface>(assemblies);

            Assert.AreEqual(2, result.Instances.Count());
            Assert.AreEqual(0, result.Exceptions.Count());
        }
Пример #16
0
        /// <summary>
        /// Automatically inspect assemblies in the install path and load/instantiate all items of type T.
        /// This method will exclude NotAutoReflected assemblies.  These assemblies are only loaded on-demand so as
        /// to avoid TypeLoad exceptions from missing types.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private static IEnumerable <T> AutoLoadExtensions <T>()
        {
            Log.Info($"Loading extensions of type {typeof(T)} from folder: {_installPathExtensionsDirectory}");

            var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <T>(_autoReflectedAssemblies);

            foreach (var ex in result.Exceptions)
            {
                Log.Warn($"An exception occurred while loading an extension: {ex}");
            }

            return(result.Instances);
        }
        public void when_invalid_file_on_disk()
        {
            var             directory  = MakeTempDirForTest();
            Action <string> testMethod = directoryPath =>
            {
                var filePath1 = Path.Combine(directoryPath, "foo.dll");
                File.CreateText(filePath1);
                var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>(filePath1);
                Assert.AreEqual(0, result.Instances.Count());
                Assert.AreEqual(0, result.Exceptions.Count());
            };

            AppDomainExtensions.IsolateMethodInAppDomain(testMethod, directory.FullName);
            directory.Delete(true);
        }
Пример #18
0
        static Framework()
        {
            //CultureInfo = CultureInfo.CurrentCulture;
            CultureInfo = null;

            ConfigurationManager = new ConfigurationManagerAdapter();
            //ConfigurationManager = new LuxConfigurationManager(new ConfigurationManagerAdapter());

            ConfigManager = new XmlConfigManager();
            TypeInstantiator = new TypeInstantiator();
            Asserter = new EmptyAsserter();
            LogFactory = new NullObjectLogFactory();

#if DEBUG
            LogFactory = new DebugLogFactory();
#endif
        }
        public void when_finds_files_on_disk()
        {
            var             directory  = MakeTempDirForTest();
            Action <string> testMethod = directoryPath =>
            {
                var filePath1 = Path.Combine(directoryPath, "foo.dll");
                var filePath2 = Path.Combine(directoryPath, "bar.dll");
                GenerateAssembly(@"public class Foo : IInterface {}", filePath1);
                GenerateAssembly(@"public class Bar : IInterface {}", filePath2);
                var result = TypeInstantiator.ExportedInstancesFromAssemblyPaths <IInterface>(filePath1, filePath2);
                Assert.AreEqual(2, result.Instances.Count());
                Assert.AreEqual(0, result.Exceptions.Count());
            };

            AppDomainExtensions.IsolateMethodInAppDomain(testMethod, directory.FullName);
            directory.Delete(true);
        }
Пример #20
0
 public void AddTypeInstantiator <T>(TypeInstantiator typeInstantiator)
 {
     _instantiators.Add(typeof(T), typeInstantiator);
 }
Пример #21
0
 public static void AddTypeSubstitution <T>(TypeInstantiator typeInstantiator)
 {
     TypeSubstitution.Add(typeof(T), typeInstantiator);
 }