/// <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; } }
/// <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; } }
/// <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; } }