|
|
|
@ -7,6 +7,7 @@ using System.IO; |
|
|
|
using System.Linq; |
|
|
|
using System.Reflection; |
|
|
|
using System.Runtime.InteropServices; |
|
|
|
using SixLabors.ImageSharp.Memory; |
|
|
|
|
|
|
|
namespace SixLabors.ImageSharp.Tests |
|
|
|
{ |
|
|
|
@ -46,13 +47,12 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
|
|
|
|
internal static string SolutionDirectoryFullPath => SolutionDirectoryFullPathLazy.Value; |
|
|
|
|
|
|
|
private static readonly FileInfo TestAssemblyFile = |
|
|
|
new FileInfo(typeof(TestEnvironment).GetTypeInfo().Assembly.Location); |
|
|
|
|
|
|
|
private static string GetSolutionDirectoryFullPathImpl() |
|
|
|
{ |
|
|
|
string assemblyLocation = typeof(TestEnvironment).GetTypeInfo().Assembly.Location; |
|
|
|
|
|
|
|
var assemblyFile = new FileInfo(assemblyLocation); |
|
|
|
|
|
|
|
DirectoryInfo directory = assemblyFile.Directory; |
|
|
|
DirectoryInfo directory = TestAssemblyFile.Directory; |
|
|
|
|
|
|
|
while (!directory.EnumerateFiles(ImageSharpSolutionFileName).Any()) |
|
|
|
{ |
|
|
|
@ -63,13 +63,13 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
throw new Exception( |
|
|
|
$"Unable to find ImageSharp solution directory from {assemblyLocation} because of {ex.GetType().Name}!", |
|
|
|
$"Unable to find ImageSharp solution directory from {TestAssemblyFile} because of {ex.GetType().Name}!", |
|
|
|
ex); |
|
|
|
} |
|
|
|
|
|
|
|
if (directory == null) |
|
|
|
{ |
|
|
|
throw new Exception($"Unable to find ImageSharp solution directory from {assemblyLocation}!"); |
|
|
|
throw new Exception($"Unable to find ImageSharp solution directory from {TestAssemblyFile}!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -138,7 +138,7 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
/// <summary>
|
|
|
|
/// Creates Microsoft.DotNet.RemoteExecutor.exe.config for .NET framework,
|
|
|
|
/// When running in 32 bits, enforces 32 bit execution of Microsoft.DotNet.RemoteExecutor.exe
|
|
|
|
/// with the help of corflags.exe found in Windows SDK.
|
|
|
|
/// with the help of CorFlags.exe found in Windows SDK.
|
|
|
|
/// </summary>
|
|
|
|
internal static void PrepareRemoteExecutor() |
|
|
|
{ |
|
|
|
@ -147,16 +147,16 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
var assemblyFile = new FileInfo(typeof(TestEnvironment).GetTypeInfo().Assembly.Location); |
|
|
|
string remoteExecutorConfigPath = |
|
|
|
Path.Combine(assemblyFile.DirectoryName, "Microsoft.DotNet.RemoteExecutor.exe.config"); |
|
|
|
Path.Combine(TestAssemblyFile.DirectoryName, "Microsoft.DotNet.RemoteExecutor.exe.config"); |
|
|
|
|
|
|
|
if (File.Exists(remoteExecutorConfigPath)) |
|
|
|
{ |
|
|
|
// already prepared
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
string testProjectConfigPath = assemblyFile.FullName + ".config"; |
|
|
|
string testProjectConfigPath = TestAssemblyFile.FullName + ".config"; |
|
|
|
|
|
|
|
File.Copy(testProjectConfigPath, remoteExecutorConfigPath); |
|
|
|
|
|
|
|
@ -165,43 +165,43 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// Locate and run CorFlags.exe:
|
|
|
|
try |
|
|
|
{ |
|
|
|
string windowsSdksDir = Path.Combine(Environment.GetEnvironmentVariable("PROGRAMFILES(x86)"), |
|
|
|
"Microsoft SDKs", "Windows"); |
|
|
|
EnsureRemoteExecutorIs32Bit(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Locate and run CorFlags.exe /32Bit+
|
|
|
|
/// https://docs.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool
|
|
|
|
/// </summary>
|
|
|
|
private static void EnsureRemoteExecutorIs32Bit() |
|
|
|
{ |
|
|
|
string windowsSdksDir = Path.Combine(Environment.GetEnvironmentVariable("PROGRAMFILES(x86)"), |
|
|
|
"Microsoft SDKs", "Windows"); |
|
|
|
|
|
|
|
FileInfo corFlagsFile = Find(new DirectoryInfo(windowsSdksDir), "corflags.exe"); |
|
|
|
FileInfo corFlagsFile = Find(new DirectoryInfo(windowsSdksDir), "CorFlags.exe"); |
|
|
|
|
|
|
|
string remoteExecutorPath = Path.Combine(assemblyFile.DirectoryName, "Microsoft.DotNet.RemoteExecutor.exe"); |
|
|
|
string remoteExecutorPath = Path.Combine(TestAssemblyFile.DirectoryName, "Microsoft.DotNet.RemoteExecutor.exe"); |
|
|
|
|
|
|
|
string args = $"{remoteExecutorPath} /32Bit+ /Force"; |
|
|
|
string args = $"{remoteExecutorPath} /32Bit+ /Force"; |
|
|
|
|
|
|
|
var si = new ProcessStartInfo() |
|
|
|
{ |
|
|
|
FileName = corFlagsFile.FullName, |
|
|
|
Arguments = args, |
|
|
|
UseShellExecute = false, |
|
|
|
RedirectStandardOutput = true, |
|
|
|
RedirectStandardError = true |
|
|
|
}; |
|
|
|
|
|
|
|
using var proc = Process.Start(si); |
|
|
|
proc.WaitForExit(); |
|
|
|
string standardOutput = proc.StandardOutput.ReadToEnd(); |
|
|
|
string standardError = proc.StandardError.ReadToEnd(); |
|
|
|
Debug.Print(standardOutput); |
|
|
|
Debug.Print(standardError); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
var si = new ProcessStartInfo() |
|
|
|
{ |
|
|
|
// Avoid fatal exceptions here
|
|
|
|
Debug.Print(ex.Message); |
|
|
|
} |
|
|
|
FileName = corFlagsFile.FullName, |
|
|
|
Arguments = args, |
|
|
|
UseShellExecute = false, |
|
|
|
RedirectStandardOutput = true, |
|
|
|
RedirectStandardError = true |
|
|
|
}; |
|
|
|
|
|
|
|
using var proc = Process.Start(si); |
|
|
|
proc.WaitForExit(); |
|
|
|
string standardOutput = proc.StandardOutput.ReadToEnd(); |
|
|
|
string standardError = proc.StandardError.ReadToEnd(); |
|
|
|
Debug.Print(standardOutput); |
|
|
|
Debug.Print(standardError); |
|
|
|
|
|
|
|
static FileInfo Find(DirectoryInfo root, string name) |
|
|
|
{ |
|
|
|
FileInfo fi = root.EnumerateFiles().FirstOrDefault(f => f.Name.ToLower() == name); |
|
|
|
FileInfo fi = root.EnumerateFiles(name).FirstOrDefault(); |
|
|
|
if (fi != null) |
|
|
|
{ |
|
|
|
return fi; |
|
|
|
|