From 06a5c47a7e2230ca489804c44a905048244c0069 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:01:58 +1000 Subject: [PATCH] Get output dll path from workspace --- .../Features/Analysis/RoslynAnalysis.cs | 9 +++++++++ .../Features/Evaluation/ProjectEvaluation.cs | 8 -------- src/SharpIDE.Application/Features/Run/RunService.cs | 10 ++++++---- .../Features/Testing/TestRunnerService.cs | 9 ++++++--- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs index baed726..ec19150 100644 --- a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs +++ b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs @@ -1000,6 +1000,15 @@ public class RoslynAnalysis(ILogger logger, BuildService buildSe _workspace.TryApplyChanges(updatedSolution); } + public async Task GetOutputDllPathForProject(SharpIdeProjectModel projectModel) + { + await _solutionLoadedTcs.Task; + var project = GetProjectForSharpIdeProjectModel(projectModel); + var outputPath = project.OutputFilePath; + Guard.Against.NullOrWhiteSpace(outputPath); + return outputPath; + } + private static Project GetProjectForSharpIdeFile(SharpIdeFile sharpIdeFile) { var sharpIdeProjectModel = ((IChildSharpIdeNode)sharpIdeFile).GetNearestProjectNode()!; diff --git a/src/SharpIDE.Application/Features/Evaluation/ProjectEvaluation.cs b/src/SharpIDE.Application/Features/Evaluation/ProjectEvaluation.cs index e5f1816..e13577c 100644 --- a/src/SharpIDE.Application/Features/Evaluation/ProjectEvaluation.cs +++ b/src/SharpIDE.Application/Features/Evaluation/ProjectEvaluation.cs @@ -32,14 +32,6 @@ public static class ProjectEvaluation project.ReevaluateIfNecessary(); } - public static string? GetOutputDllFullPath(SharpIdeProjectModel projectModel) - { - var project = _projectCollection.GetLoadedProjects(projectModel.FilePath).Single(); - var targetPath = project.GetPropertyValue("TargetPath"); - Guard.Against.NullOrWhiteSpace(targetPath, nameof(targetPath)); - return targetPath; - } - public static Guid GetOrCreateDotnetUserSecretsId(SharpIdeProjectModel projectModel) { Guard.Against.Null(projectModel, nameof(projectModel)); diff --git a/src/SharpIDE.Application/Features/Run/RunService.cs b/src/SharpIDE.Application/Features/Run/RunService.cs index 2f66cc9..63e351e 100644 --- a/src/SharpIDE.Application/Features/Run/RunService.cs +++ b/src/SharpIDE.Application/Features/Run/RunService.cs @@ -3,6 +3,7 @@ using System.Threading.Channels; using Ardalis.GuardClauses; using AsyncReadProcess; using Microsoft.Extensions.Logging; +using SharpIDE.Application.Features.Analysis; using SharpIDE.Application.Features.Debugging; using SharpIDE.Application.Features.Evaluation; using SharpIDE.Application.Features.Events; @@ -11,13 +12,14 @@ using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; namespace SharpIDE.Application.Features.Run; -public class RunService(ILogger logger) +public class RunService(ILogger logger, RoslynAnalysis roslynAnalysis) { private readonly ConcurrentDictionary _projectLocks = []; public ConcurrentDictionary> Breakpoints { get; } = []; private Debugger? _debugger; // TODO: Support multiple debuggers for multiple running projects private readonly ILogger _logger = logger; + private readonly RoslynAnalysis _roslynAnalysis = roslynAnalysis; public async Task RunProject(SharpIdeProjectModel project, bool isDebug = false, string? debuggerExecutablePath = null) { @@ -40,7 +42,7 @@ public class RunService(ILogger logger) FileName = "dotnet", WorkingDirectory = Path.GetDirectoryName(project.FilePath), //Arguments = $"run --project \"{project.FilePath}\" --no-restore", - Arguments = GetRunArguments(project), + Arguments = await GetRunArguments(project), RedirectStandardOutput = true, RedirectStandardError = true, EnvironmentVariables = [] @@ -156,9 +158,9 @@ public class RunService(ILogger logger) return await _debugger!.GetInfoAtStopPoint(); } - private string GetRunArguments(SharpIdeProjectModel project) + private async Task GetRunArguments(SharpIdeProjectModel project) { - var dllFullPath = ProjectEvaluation.GetOutputDllFullPath(project); + var dllFullPath = await _roslynAnalysis.GetOutputDllPathForProject(project); if (project.IsBlazorProject) { var blazorDevServerVersion = project.BlazorDevServerVersion; diff --git a/src/SharpIDE.Application/Features/Testing/TestRunnerService.cs b/src/SharpIDE.Application/Features/Testing/TestRunnerService.cs index 1570aab..460e465 100644 --- a/src/SharpIDE.Application/Features/Testing/TestRunnerService.cs +++ b/src/SharpIDE.Application/Features/Testing/TestRunnerService.cs @@ -1,12 +1,15 @@ -using SharpIDE.Application.Features.Evaluation; +using SharpIDE.Application.Features.Analysis; +using SharpIDE.Application.Features.Evaluation; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Application.Features.Testing.Client; using SharpIDE.Application.Features.Testing.Client.Dtos; namespace SharpIDE.Application.Features.Testing; -public class TestRunnerService +public class TestRunnerService(RoslynAnalysis roslynAnalysis) { + private readonly RoslynAnalysis _roslynAnalysis = roslynAnalysis; + public async Task> DiscoverTests(SharpIdeSolutionModel solutionModel) { await Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)); @@ -59,7 +62,7 @@ public class TestRunnerService private async Task GetInitialisedClientAsync(SharpIdeProjectModel project) { - var outputDllPath = ProjectEvaluation.GetOutputDllFullPath(project); + var outputDllPath = await _roslynAnalysis.GetOutputDllPathForProject(project); var outputExecutablePath = 0 switch { _ when OperatingSystem.IsWindows() => outputDllPath!.Replace(".dll", ".exe"),