Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ExecutorWrapper"/> class.
        /// </summary>
        /// <param name="assemblyFilename">The assembly filename.</param>
        /// <param name="configFilename">The config filename. If null, the default config filename will be used.</param>
        /// <param name="shadowCopy">Set to true to enable shadow copying; false, otherwise.</param>
        public ExecutorWrapper(string assemblyFilename, string configFilename, bool shadowCopy)
        {
            assemblyFilename = Path.GetFullPath(assemblyFilename);
            if (!File.Exists(assemblyFilename))
                throw new ArgumentException("Could not find file: " + assemblyFilename);

            if (configFilename == null)
                configFilename = GetDefaultConfigFile(assemblyFilename);

            if (configFilename != null)
                configFilename = Path.GetFullPath(configFilename);

            AssemblyFilename = assemblyFilename;
            ConfigFilename = configFilename;

            appDomain = CreateAppDomain(assemblyFilename, configFilename, shadowCopy);

            try
            {
                string xunitAssemblyFilename = Path.Combine(Path.GetDirectoryName(assemblyFilename), "xunit.dll");

                if (!File.Exists(xunitAssemblyFilename))
                    throw new ArgumentException("Could not find file: " + xunitAssemblyFilename);

                xunitAssemblyName = AssemblyName.GetAssemblyName(xunitAssemblyFilename);
                executor = CreateObject("Xunit.Sdk.Executor", AssemblyFilename);

                Version xunitVersion = new Version(XunitVersion);

                // Prefer the ASP.NET callback, as it's less troublesome (and faster)
                if (typeICallbackEventHandler != null)
                {
                    MakeIntCallbackHandler = () => (IntCallbackHandler)intCallbackHandlerCtor.Invoke(new object[0]);
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => (XmlNodeCallbackHandler)xmlNodeCallbackHandlerCtor.Invoke(new object[] { callback, lastNodeName });
                }
                // Fallback to the slightly more evil coopting of remoting when we know xunit.dll can do it (1.6+)
                else if (xunitVersion.Major > 1 || xunitVersion.Minor >= 6)
                {
                    MakeIntCallbackHandler = () => new IntCallbackHandlerWithIMessageSink();
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => new XmlNodeCallbackHandlerWithIMessageSink(callback, lastNodeName);
                }
                // No ASP.NET, xUnit.net < 1.6, we have to bail and demand the full .NET profile
                else
                {
                    throw new InvalidOperationException("Attempted to run assembly linked to xUnit.net older than 1.6. This requires the full server version of .NET, which does not appear to be installed.");
                }
            }
            catch (TargetInvocationException ex)
            {
                Dispose();
                RethrowWithNoStackTraceLoss(ex.InnerException);
            }
            catch (Exception)
            {
                Dispose();
                throw;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ExecutorWrapper"/> class.
        /// </summary>
        /// <param name="assemblyFilename">The assembly filename.</param>
        /// <param name="configFilename">The config filename. If null, the default config filename will be used.</param>
        /// <param name="shadowCopy">Set to true to enable shadow copying; false, otherwise.</param>
        public ExecutorWrapper(string assemblyFilename, string configFilename, bool shadowCopy)
        {
            assemblyFilename = Path.GetFullPath(assemblyFilename);
            if (!File.Exists(assemblyFilename))
                throw new ArgumentException("Could not find file: " + assemblyFilename);

            if (configFilename == null)
                configFilename = GetDefaultConfigFile(assemblyFilename);

            if (configFilename != null)
                configFilename = Path.GetFullPath(configFilename);

            AssemblyFilename = assemblyFilename;
            ConfigFilename = configFilename;

            appDomain = CreateAppDomain(assemblyFilename, configFilename, shadowCopy);

            try
            {
                string xunitAssemblyFilename = Path.Combine(Path.GetDirectoryName(assemblyFilename), "xunit.dll");

                if (!File.Exists(xunitAssemblyFilename))
                    throw new ArgumentException("Could not find file: " + xunitAssemblyFilename);

                xunitAssemblyName = AssemblyName.GetAssemblyName(xunitAssemblyFilename);
                executor = CreateObject("Xunit.Sdk.Executor", AssemblyFilename);

                Version xunitVersion = new Version(XunitVersion);

                if (xunitVersion.Major == 1 && xunitVersion.Minor < 6)
                {
                    if (typeICallbackEventHandler == null)
                        throw new InvalidOperationException("Attempted to run assembly linked to xUnit.net older than 1.6. This requires the full server version of .NET, which does not appear to be installed.");

                    MakeIntCallbackHandler = () => (IntCallbackHandler)intCallbackHandlerCtor.Invoke(new object[0]);
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => (XmlNodeCallbackHandler)xmlNodeCallbackHandlerCtor.Invoke(new object[] { callback, lastNodeName });
                }
                else
                {
                    MakeIntCallbackHandler = () => new IntCallbackHandlerWithIMessageSink();
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => new XmlNodeCallbackHandlerWithIMessageSink(callback, lastNodeName);
                }

            }
            catch (TargetInvocationException ex)
            {
                Dispose();
                RethrowWithNoStackTraceLoss(ex.InnerException);
            }
            catch (Exception)
            {
                Dispose();
                throw;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ExecutorWrapper"/> class.
        /// </summary>
        /// <param name="assemblyFilename">The assembly filename.</param>
        /// <param name="configFilename">The config filename. If null, the default config filename will be used.</param>
        /// <param name="shadowCopy">Set to true to enable shadow copying; false, otherwise.</param>
        public ExecutorWrapper(string assemblyFilename, string configFilename, bool shadowCopy)
        {
            assemblyFilename = Path.GetFullPath(assemblyFilename);
            if (!File.Exists(assemblyFilename))
            {
                throw new ArgumentException("Could not find file: " + assemblyFilename);
            }

            if (configFilename == null)
            {
                configFilename = GetDefaultConfigFile(assemblyFilename);
            }

            if (configFilename != null)
            {
                configFilename = Path.GetFullPath(configFilename);
            }

            AssemblyFilename = assemblyFilename;
            ConfigFilename   = configFilename;

            appDomain = CreateAppDomain(assemblyFilename, configFilename, shadowCopy);

            try
            {
                string xunitAssemblyFilename = Path.Combine(Path.GetDirectoryName(assemblyFilename), "xunit.dll");

                if (!File.Exists(xunitAssemblyFilename))
                {
                    throw new ArgumentException("Could not find file: " + xunitAssemblyFilename);
                }

                xunitAssemblyName = AssemblyName.GetAssemblyName(xunitAssemblyFilename);
                executor          = CreateObject("Xunit.Sdk.Executor", AssemblyFilename);

                Version xunitVersion = new Version(XunitVersion);

                if (xunitVersion.Major == 1 && xunitVersion.Minor < 6)
                {
                    if (typeICallbackEventHandler == null)
                    {
                        throw new InvalidOperationException("Attempted to run assembly linked to xUnit.net older than 1.6. This requires the full server version of .NET, which does not appear to be installed.");
                    }

                    MakeIntCallbackHandler     = () => (IntCallbackHandler)intCallbackHandlerCtor.Invoke(new object[0]);
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => (XmlNodeCallbackHandler)xmlNodeCallbackHandlerCtor.Invoke(new object[] { callback, lastNodeName });
                }
                else
                {
                    MakeIntCallbackHandler     = () => new IntCallbackHandlerWithIMessageSink();
                    MakeXmlNodeCallbackHandler = (callback, lastNodeName) => new XmlNodeCallbackHandlerWithIMessageSink(callback, lastNodeName);
                }
            }
            catch (TargetInvocationException ex)
            {
                Dispose();
                RethrowWithNoStackTraceLoss(ex.InnerException);
            }
            catch (Exception)
            {
                Dispose();
                throw;
            }
        }