/// <summary> /// Scan a single assembly for extensions marked by ExtensionAttribute. /// For each extension, create an ExtensionNode and link it to the /// correct ExtensionPoint. Public for testing. /// </summary> internal void FindExtensionsInAssembly(ExtensionAssembly assembly) { log.Info("Scanning {0} assembly for Extensions", assembly.FilePath); if (CanLoadTargetFramework(Assembly.GetEntryAssembly(), assembly)) { IRuntimeFramework assemblyTargetFramework = null; #if !NETSTANDARD2_0 var currentFramework = RuntimeFramework.CurrentFramework; assemblyTargetFramework = assembly.TargetFramework; if (!currentFramework.CanLoad(assemblyTargetFramework)) { if (!assembly.FromWildCard) { throw new NUnitEngineException($"Extension {assembly.FilePath} targets {assemblyTargetFramework.DisplayName}, which is not available."); } else { log.Info($"Assembly {assembly.FilePath} targets {assemblyTargetFramework.DisplayName}, which is not available. Assembly found via wildcard."); return; } } #endif foreach (var type in assembly.MainModule.GetTypes()) { CustomAttribute extensionAttr = type.GetAttribute("NUnit.Engine.Extensibility.ExtensionAttribute"); if (extensionAttr == null) { continue; } object versionArg = extensionAttr.GetNamedArgument("EngineVersion"); if (versionArg != null && new Version((string)versionArg) > ENGINE_VERSION) { continue; } var node = new ExtensionNode(assembly.FilePath, type.FullName, assemblyTargetFramework); node.Path = extensionAttr.GetNamedArgument("Path") as string; node.Description = extensionAttr.GetNamedArgument("Description") as string; object enabledArg = extensionAttr.GetNamedArgument("Enabled"); node.Enabled = enabledArg != null ? (bool)enabledArg : true; log.Info(" Found ExtensionAttribute on Type " + type.Name); foreach (var attr in type.GetAttributes("NUnit.Engine.Extensibility.ExtensionPropertyAttribute")) { string name = attr.ConstructorArguments[0].Value as string; string value = attr.ConstructorArguments[1].Value as string; if (name != null && value != null) { node.AddProperty(name, value); log.Info(" ExtensionProperty {0} = {1}", name, value); } } _extensions.Add(node); ExtensionPoint ep; if (node.Path == null) { ep = DeduceExtensionPointFromType(type); if (ep == null) { string msg = string.Format( "Unable to deduce ExtensionPoint for Type {0}. Specify Path on ExtensionAttribute to resolve.", type.FullName); throw new NUnitEngineException(msg); } node.Path = ep.Path; } else { ep = GetExtensionPoint(node.Path); if (ep == null) { string msg = string.Format( "Unable to locate ExtensionPoint for Type {0}. The Path {1} cannot be found.", type.FullName, node.Path); throw new NUnitEngineException(msg); } } ep.Install(node); } } }
/// <summary> /// Scan a single assembly for extensions marked by ExtensionAttribute. /// For each extension, create an ExtensionNode and link it to the /// correct ExtensionPoint. Public for testing. /// </summary> internal void FindExtensionsInAssembly(ExtensionAssembly assembly) { log.Info($"Scanning {assembly.FilePath} for Extensions"); if (!CanLoadTargetFramework(Assembly.GetEntryAssembly(), assembly)) { log.Info($"{assembly.FilePath} cannot be loaded on this runtime"); return; } IRuntimeFramework assemblyTargetFramework = null; #if NETFRAMEWORK var currentFramework = RuntimeFramework.CurrentFramework; assemblyTargetFramework = assembly.TargetFramework; if (!currentFramework.CanLoad(assemblyTargetFramework)) { //Temp fix: Prevent crash in agent if an extension is used by the main engine, which targets a framework that can not be loaded on a particular agent // https://github.com/nunit/nunit-console/issues/757 //Long-term fix is to not search for extensions within the agent, see https://github.com/nunit/nunit-console/issues/760 if (_isRunningOnAgent) { return; } if (!assembly.FromWildCard) { throw new NUnitEngineException($"Extension {assembly.FilePath} targets {assemblyTargetFramework.DisplayName}, which is not available."); } else { log.Info($"Assembly {assembly.FilePath} targets {assemblyTargetFramework.DisplayName}, which is not available. Assembly found via wildcard."); return; } } #endif foreach (var type in assembly.MainModule.GetTypes()) { CustomAttribute extensionAttr = type.GetAttribute("NUnit.Engine.Extensibility.ExtensionAttribute"); if (extensionAttr == null) { continue; } object versionArg = extensionAttr.GetNamedArgument("EngineVersion"); if (versionArg != null && new Version((string)versionArg) > ENGINE_VERSION) { continue; } var node = new ExtensionNode(assembly.FilePath, assembly.AssemblyVersion, type.FullName, assemblyTargetFramework); node.Path = extensionAttr.GetNamedArgument("Path") as string; node.Description = extensionAttr.GetNamedArgument("Description") as string; object enabledArg = extensionAttr.GetNamedArgument("Enabled"); node.Enabled = enabledArg != null ? (bool)enabledArg : true; log.Info(" Found ExtensionAttribute on Type " + type.Name); foreach (var attr in type.GetAttributes("NUnit.Engine.Extensibility.ExtensionPropertyAttribute")) { string name = attr.ConstructorArguments[0].Value as string; string value = attr.ConstructorArguments[1].Value as string; if (name != null && value != null) { node.AddProperty(name, value); log.Info(" ExtensionProperty {0} = {1}", name, value); } } _extensions.Add(node); ExtensionPoint ep; if (node.Path == null) { ep = DeduceExtensionPointFromType(type); if (ep == null) { string msg = string.Format( "Unable to deduce ExtensionPoint for Type {0}. Specify Path on ExtensionAttribute to resolve.", type.FullName); throw new NUnitEngineException(msg); } node.Path = ep.Path; } else { ep = GetExtensionPoint(node.Path); if (ep == null) { string msg = string.Format( "Unable to locate ExtensionPoint for Type {0}. The Path {1} cannot be found.", type.FullName, node.Path); throw new NUnitEngineException(msg); } } ep.Install(node); } }
/// <summary> /// Scan a single assembly for extensions marked by ExtensionAttribute. /// For each extension, create an ExtensionNode and link it to the /// correct ExtensionPoint. Public for testing. /// </summary> public void FindExtensionsInAssembly(string assemblyName, bool specifiedInConfig) { log.Info("Scanning {0} assembly for Extensions", assemblyName); var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(Path.GetDirectoryName(assemblyName)); resolver.AddSearchDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); var parameters = new ReaderParameters() { AssemblyResolver = resolver }; ModuleDefinition module; try { module = AssemblyDefinition.ReadAssembly(assemblyName, parameters).MainModule; } //Thrown if assembly is unmanaged catch (BadImageFormatException e) { if (specifiedInConfig) { throw new NUnitEngineException(String.Format("Specified extension {0} could not be read", assemblyName), e); } else { return; } } foreach (var type in module.GetTypes()) { CustomAttribute extensionAttr = type.GetAttribute("NUnit.Engine.Extensibility.ExtensionAttribute"); if (extensionAttr != null) { var node = new ExtensionNode(assemblyName, type.FullName); node.Path = extensionAttr.GetNamedArgument("Path") as string; node.Description = extensionAttr.GetNamedArgument("Description") as string; log.Info(" Found ExtensionAttribute on Type " + type.Name); foreach (var attr in type.GetAttributes("NUnit.Engine.Extensibility.ExtensionPropertyAttribute")) { string name = attr.ConstructorArguments[0].Value as string; string value = attr.ConstructorArguments[1].Value as string; if (name != null && value != null) { node.AddProperty(name, value); log.Info(" ExtensionProperty {0} = {1}", name, value); } } _extensions.Add(node); ExtensionPoint ep; if (node.Path == null) { ep = DeduceExtensionPointFromType(type); if (ep == null) { string msg = string.Format( "Unable to deduce ExtensionPoint for Type {0}. Specify Path on ExtensionAttribute to resolve.", type.FullName); throw new NUnitEngineException(msg); } node.Path = ep.Path; } else { ep = GetExtensionPoint(node.Path); if (ep == null) { string msg = string.Format( "Unable to locate ExtensionPoint for Type {0}. The Path {1} cannot be found.", type.FullName, node.Path); throw new NUnitEngineException(msg); } } ep.Install(node); } } }
/// <summary> /// Scan a single assembly for extensions marked by ExtensionAttribute. /// For each extension, create an ExtensionNode and link it to the /// correct ExtensionPoint. Public for testing. /// </summary> public void FindExtensionsInAssembly(ExtensionAssembly assembly) { log.Info("Scanning {0} assembly for Extensions", assembly.FilePath); foreach (var type in assembly.MainModule.GetTypes()) { CustomAttribute extensionAttr = type.GetAttribute("NUnit.Engine.Extensibility.ExtensionAttribute"); if (extensionAttr == null) { continue; } object versionArg = extensionAttr.GetNamedArgument("EngineVersion"); if (versionArg != null && new Version((string)versionArg) > ENGINE_VERSION) { continue; } var node = new ExtensionNode(assembly.FilePath, type.FullName); node.Path = extensionAttr.GetNamedArgument("Path") as string; node.Description = extensionAttr.GetNamedArgument("Description") as string; object enabledArg = extensionAttr.GetNamedArgument("Enabled"); node.Enabled = enabledArg != null ? (bool)enabledArg : true; log.Info(" Found ExtensionAttribute on Type " + type.Name); foreach (var attr in type.GetAttributes("NUnit.Engine.Extensibility.ExtensionPropertyAttribute")) { string name = attr.ConstructorArguments[0].Value as string; string value = attr.ConstructorArguments[1].Value as string; if (name != null && value != null) { node.AddProperty(name, value); log.Info(" ExtensionProperty {0} = {1}", name, value); } } _extensions.Add(node); ExtensionPoint ep; if (node.Path == null) { ep = DeduceExtensionPointFromType(type); if (ep == null) { string msg = string.Format( "Unable to deduce ExtensionPoint for Type {0}. Specify Path on ExtensionAttribute to resolve.", type.FullName); throw new NUnitEngineException(msg); } node.Path = ep.Path; } else { ep = GetExtensionPoint(node.Path); if (ep == null) { string msg = string.Format( "Unable to locate ExtensionPoint for Type {0}. The Path {1} cannot be found.", type.FullName, node.Path); throw new NUnitEngineException(msg); } } ep.Install(node); } }
/// <summary> /// Scan a single assembly for extensions marked by ExtensionAttribute. /// For each extension, create an ExtensionNode and link it to the /// correct ExtensionPoint. /// </summary> private void FindExtensionsInAssembly(string assemblyName) { var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(Path.GetDirectoryName(assemblyName)); var parameters = new ReaderParameters() { AssemblyResolver = resolver }; var module = AssemblyDefinition.ReadAssembly(assemblyName, parameters).MainModule; foreach (var type in module.GetTypes()) { CustomAttribute extensionAttr = type.GetAttribute("NUnit.Engine.Extensibility.ExtensionAttribute"); if (extensionAttr != null) { var node = new ExtensionNode(assemblyName, type.FullName); node.Path = extensionAttr.GetNamedArgument("Path") as string; node.Description = extensionAttr.GetNamedArgument("Description") as string; foreach (var attr in type.GetAttributes("NUnit.Engine.Extensibility.ExtensionPropertyAttribute")) { string name = attr.ConstructorArguments[0].Value as string; string value = attr.ConstructorArguments[1].Value as string; if (name != null && value != null) { node.AddProperty(name, value); } } _extensions.Add(node); ExtensionPoint ep; if (node.Path == null) { ep = DeduceExtensionPointFromType(type); if (ep == null) { string msg = string.Format( "Unable to deduce ExtensionPoint for Type {0}. Specify Path on ExtensionAttribute to resolve.", type.FullName); throw new NUnitEngineException(msg); } node.Path = ep.Path; } else { ep = GetExtensionPoint(node.Path); if (ep == null) { string msg = string.Format( "Unable to locate ExtensionPoint for Type {0}. The Path {1} cannot be found.", type.FullName, node.Path); throw new NUnitEngineException(msg); } } ep.Install(node); } } }