using System.Diagnostics;
using Microsoft.VisualBasic;
CreateAndRunCsharpContainer(1, "Console.WriteLine(\"Hello World!\")");
string CreateAndRunCsharpContainer(int assignmentId, string userCode)
{
var projectFile = """
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
""";
var filesToCopy = new[] {
new Tuple<string, string>(userCode, "UserCode.cs"),
new Tuple<string, string>(projectFile, "ProjectFile.csproj")
};
string dockerRunCommand = $"docker run -it --rm -v {Environment.CurrentDirectory}:/app -w /app mcr.microsoft.com/dotnet/sdk:8.0";
ProcessStartInfo startContainerInfo = new ProcessStartInfo
{
FileName = "docker",
Arguments = dockerRunCommand,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = new Process { StartInfo = startContainerInfo })
{
process.Start();
foreach (var file in filesToCopy)
{
string tempFilePath = Path.Combine(Environment.CurrentDirectory, file.Item2);
File.WriteAllText(tempFilePath, file.Item1);
string copyCommand = $"docker cp {tempFilePath} {process.Id}:/app/";
ExecuteCommand(copyCommand, process);
File.Delete(tempFilePath);
}
string dotnetRunCommand = $"dotnet run --project /app/ProjectFile.csproj";
ExecuteCommand(dotnetRunCommand, process);
string outputFileContent = ReadContainerOutput(process);
process.WaitForExit();
return outputFileContent;
}
}
static void ExecuteCommand(string command, Process process)
{
process.StandardInput.WriteLine(command);
process.StandardInput.Flush();
}
static string ReadContainerOutput(Process process)
{
string output = process.StandardOutput.ReadToEnd();
return output;
}
using System.Diagnostics;
using Microsoft.VisualBasic;
CreateAndRunCsharpContainer(1, "Console.WriteLine(\"Hello World!\")");
string CreateAndRunCsharpContainer(int assignmentId, string userCode)
{
var projectFile = """
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
""";
var filesToCopy = new[] {
new Tuple<string, string>(userCode, "UserCode.cs"),
new Tuple<string, string>(projectFile, "ProjectFile.csproj")
};
string dockerRunCommand = $"docker run -it --rm -v {Environment.CurrentDirectory}:/app -w /app mcr.microsoft.com/dotnet/sdk:8.0";
ProcessStartInfo startContainerInfo = new ProcessStartInfo
{
FileName = "docker",
Arguments = dockerRunCommand,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = new Process { StartInfo = startContainerInfo })
{
process.Start();
foreach (var file in filesToCopy)
{
string tempFilePath = Path.Combine(Environment.CurrentDirectory, file.Item2);
File.WriteAllText(tempFilePath, file.Item1);
string copyCommand = $"docker cp {tempFilePath} {process.Id}:/app/";
ExecuteCommand(copyCommand, process);
File.Delete(tempFilePath);
}
string dotnetRunCommand = $"dotnet run --project /app/ProjectFile.csproj";
ExecuteCommand(dotnetRunCommand, process);
string outputFileContent = ReadContainerOutput(process);
process.WaitForExit();
return outputFileContent;
}
}
static void ExecuteCommand(string command, Process process)
{
process.StandardInput.WriteLine(command);
process.StandardInput.Flush();
}
static string ReadContainerOutput(Process process)
{
string output = process.StandardOutput.ReadToEnd();
return output;
}