/// <summary>
        /// Selects a target runtime framework for a TestPackage based on
        /// the settings in the package and the assemblies themselves.
        /// The package RuntimeFramework setting may be updated as a 
        /// result and the selected runtime is returned.
        /// </summary>
        /// <param name="package">A TestPackage</param>
        /// <returns>The selected RuntimeFramework</returns>
        public RuntimeFramework SelectRuntimeFramework(TestPackage package)
        {
            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
            RuntimeFramework requestedFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;

            log.Debug("Current framework is {0}", currentFramework);
            if (requestedFramework == null)
                log.Debug("No specific framework requested");
            else
                log.Debug("Requested framework is {0}", requestedFramework);

            RuntimeType targetRuntime = requestedFramework == null
                ? RuntimeType.Any 
                : requestedFramework.Runtime;
            Version targetVersion = requestedFramework == null
                ? RuntimeFramework.DefaultVersion
                : requestedFramework.FrameworkVersion;

            if (targetRuntime == RuntimeType.Any)
                targetRuntime = currentFramework.Runtime;

            if (targetVersion == RuntimeFramework.DefaultVersion)
            {
                if (Services.UserSettings.GetSetting("Options.TestLoader.RuntimeSelectionEnabled", true))
                    foreach (string assembly in package.Assemblies)
                    {
                        using (AssemblyReader reader = new AssemblyReader(assembly))
                        {
                            string vString = reader.ImageRuntimeVersion;
                            if (vString.Length > 1) // Make sure it's a valid dot net assembly
                            {
                                Version v = new Version(vString.Substring(1));
                                log.Debug("Assembly {0} uses version {1}", assembly, v);
                                if (v > targetVersion) targetVersion = v;
                            }
                        }
                    }
                else
                    targetVersion = RuntimeFramework.CurrentFramework.ClrVersion;

                RuntimeFramework checkFramework = new RuntimeFramework(targetRuntime, targetVersion);
                if (!checkFramework.IsAvailable || !Services.TestAgency.IsRuntimeVersionSupported(targetVersion))
                {
                    log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
                    if (targetVersion < currentFramework.FrameworkVersion)
                        targetVersion = currentFramework.FrameworkVersion;
                }
            }

            RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
            package.Settings["RuntimeFramework"] = targetFramework;

            log.Debug("Test will use {0} framework", targetFramework);

            return targetFramework;
        }
        /// <summary>
        /// Selects a target runtime framework for a TestPackage based on
        /// the settings in the package and the assemblies themselves.
        /// The package RuntimeFramework setting may be updated as a 
        /// result and the selected runtime is returned.
        /// </summary>
        /// <param name="package">A TestPackage</param>
        /// <returns>The selected RuntimeFramework</returns>
        public RuntimeFramework SelectRuntimeFramework(TestPackage package)
        {
            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
            RuntimeFramework requestedFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;

            log.Debug("Current framework is {0}", currentFramework);
            if (requestedFramework == null)
                log.Debug("No specific framework requested");
            else
                log.Debug("Requested framework is {0}", requestedFramework);

            RuntimeType targetRuntime = requestedFramework == null
                ? RuntimeType.Any 
                : requestedFramework.Runtime;
            Version targetVersion = requestedFramework == null
                ? RuntimeFramework.DefaultVersion
                : requestedFramework.FrameworkVersion;

            if (targetRuntime == RuntimeType.Any)
                targetRuntime = currentFramework.Runtime;

            if (targetVersion == RuntimeFramework.DefaultVersion)
            {
                foreach (string assembly in package.Assemblies)
                {
                    using (AssemblyReader reader = new AssemblyReader(assembly))
                    {
                        Version v = new Version(reader.ImageRuntimeVersion.Substring(1));
                        log.Debug("Assembly {0} uses version {1}", assembly, v);
                        if (v > targetVersion) targetVersion = v;
                    }
                }

                RuntimeFramework checkFramework = new RuntimeFramework(targetRuntime, targetVersion);
                if (!checkFramework.IsAvailable || NUnitConfiguration.GetTestAgentExePath(targetVersion) == null)
                {
                    log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
                    if (targetVersion < currentFramework.FrameworkVersion)
                        targetVersion = currentFramework.FrameworkVersion;
                }
            }

            RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
            package.Settings["RuntimeFramework"] = targetFramework;

            log.Debug("Test will use {0} framework", targetFramework);

            return targetFramework;
        }
        private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string fullName = args.Name;
            int    index    = fullName.IndexOf(',');

            if (index == -1)                                                     // Only resolve using full name.
            {
                log.Debug(string.Format("Not a strong name: {0}", fullName));
                return(null);
            }

            if (_cache.Contains(fullName))
            {
                log.Info(string.Format("Resolved from Cache: {0}", fullName));
                return(_cache.Resolve(fullName));
            }

            foreach (string dir in _dirs)
            {
                foreach (string file in Directory.GetFiles(dir, "*.dll"))
                {
                    string fullFile = Path.Combine(dir, file);
                    using (AssemblyReader rdr = new AssemblyReader(fullFile))
                    {
                        try
                        {
                            if (rdr.IsDotNetFile)
                            {
                                if (AssemblyName.GetAssemblyName(fullFile).FullName == fullName)
                                {
                                    log.Info(string.Format("Added to Cache: {0}", fullFile));
                                    AddFile(fullFile);
                                    return(_cache.Resolve(fullName));
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            log.Error("Unable to load addin assembly", ex);
                            throw;
                        }
                    }
                }
            }

            log.Debug(string.Format("Not in Cache: {0}", fullName));
            return(null);
        }
示例#4
0
		private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
		{
			string fullName = args.Name;
			int index = fullName.IndexOf(',');
			if(index == -1)							// Only resolve using full name.
			{
				log.Debug( string.Format("Not a strong name: {0}", fullName ) );
				return null;
			}

			if ( _cache.Contains( fullName ) )
			{
				log.Info( string.Format( "Resolved from Cache: {0}", fullName ) );
				return _cache.Resolve(fullName);
			}

			foreach( string dir in _dirs )
			{
				foreach( string file in Directory.GetFiles( dir, "*.dll" ) )
				{
					string fullFile = Path.Combine( dir, file );
                    using (AssemblyReader rdr = new AssemblyReader(fullFile))
                    {
                        try
                        {
                            if (rdr.IsDotNetFile)
                            {
                                if (AssemblyName.GetAssemblyName(fullFile).FullName == fullName)
                                {
                                    log.Info(string.Format("Added to Cache: {0}", fullFile));
                                    AddFile(fullFile);
                                    return _cache.Resolve(fullName);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            log.Error("Unable to load addin assembly", ex);
                            throw;
                        }
                    }
				}
			}

			log.Debug( string.Format( "Not in Cache: {0}", fullName) ); 
			return null;
		}