2 using System.Collections.Generic;
4 using System.Runtime.InteropServices;
6 using System.Threading.Tasks;
10 sealed class EmptyConsoleProgramExecution : Benchmark
12 private const string ExecutableName = "console.dll";
14 public EmptyConsoleProgramExecution() : base("Empty Console Program")
16 ExePath = ExecutableName;
19 public override async Task Setup(DotNetInstallation dotNetInstall, string outputDir, bool useExistingSetup, ITestOutputHelper output)
21 if (!useExistingSetup)
23 using (var setupSection = new IndentedTestOutputHelper("Setup " + Name, output))
25 await SetupSourceToCompile(outputDir, dotNetInstall.FrameworkDir, useExistingSetup, setupSection);
26 RetargetProjects(dotNetInstall, GetRootDir(outputDir), new string[] { "console.csproj" });
27 await Publish(dotNetInstall, outputDir, setupSection);
31 string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion);
32 WorkingDirPath = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
33 EnvironmentVariables.Add("DOTNET_MULTILEVEL_LOOKUP", "0");
34 EnvironmentVariables.Add("UseSharedCompilation", "false");
37 #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
38 private async Task SetupSourceToCompile(string intermediateOutputDir, string runtimeDirPath, bool useExistingSetup, ITestOutputHelper output)
39 #pragma warning restore CS1998
41 const string sourceFile = "Program.cs";
42 const string csprojFile = "console.csproj";
44 string consoleProjectMainDir = GetRootDir(intermediateOutputDir);
45 FileTasks.DeleteDirectory(consoleProjectMainDir, output);
46 FileTasks.CreateDirectory(consoleProjectMainDir, output);
48 File.WriteAllLines(Path.Combine(consoleProjectMainDir, sourceFile), new[] {
50 "public static class Program",
52 " public static int Main(string[] args) => 0;",
56 File.WriteAllLines(Path.Combine(consoleProjectMainDir, csprojFile), new[] {
57 @"<Project Sdk=""Microsoft.NET.Sdk"">",
59 @" <OutputType>Exe</OutputType>",
60 @" <TargetFramework>netcoreapp2.1</TargetFramework>",
66 private async Task<string> Publish(DotNetInstallation dotNetInstall, string outputDir, ITestOutputHelper output)
68 string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion);
69 string publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
70 if (publishDir != null)
71 FileTasks.DeleteDirectory(publishDir, output);
73 string dotNetExePath = dotNetInstall.DotNetExe;
74 await new ProcessRunner(dotNetExePath, $"publish -c Release -f {tfm}")
75 .WithWorkingDirectory(GetAppSrcDirectory(outputDir))
76 .WithEnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "0")
77 .WithEnvironmentVariable("UseSharedCompilation", "false")
81 publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
82 if (publishDir == null)
83 throw new DirectoryNotFoundException("Could not find 'publish' directory");
87 private string GetAppPublishDirectory(DotNetInstallation dotNetInstall, string outputDir, string tfm)
89 string dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", dotNetInstall.Architecture, "Release", tfm, "publish");
90 if (Directory.Exists(dir))
93 dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", "Release", tfm, "publish");
94 if (Directory.Exists(dir))
100 private static string GetAppSrcDirectory(string outputDir) =>
101 Path.Combine(GetRootDir(outputDir));
103 private static string GetRootDir(string outputDir) =>
104 Path.Combine(outputDir, "EmptyDotNetConsoleProject");