diff --git a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs
index 7721153da981..befee307df5c 100644
--- a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs
+++ b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs
@@ -756,6 +756,12 @@ private bool NeedsToBuild(out CacheInfo cache)
{
cache = ComputeCacheEntry();
+ if (Directives.Any(static d => d is CSharpDirective.Project))
+ {
+ Reporter.Verbose.WriteLine("Building because there are project directives.");
+ return true;
+ }
+
// Check cache files.
string artifactsDirectory = ArtifactsPath;
diff --git a/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs b/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs
index ebe57115cb42..6af43351e143 100644
--- a/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs
+++ b/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs
@@ -3403,6 +3403,64 @@ public void UpToDate_InvalidOptions()
.And.HaveStdErrContaining(string.Format(CliCommandStrings.CannotCombineOptions, RunCommandParser.NoCacheOption.Name, RunCommandParser.NoBuildOption.Name));
}
+ ///
+ /// optimization currently does not support #:project references and hence is disabled if those are present.
+ /// See .
+ ///
+ [Fact]
+ public void UpToDate_ProjectReferences()
+ {
+ var testInstance = _testAssetsManager.CreateTestDirectory();
+
+ var libDir = Path.Join(testInstance.Path, "Lib");
+ Directory.CreateDirectory(libDir);
+
+ File.WriteAllText(Path.Join(libDir, "Lib.csproj"), $"""
+
+
+ {ToolsetInfo.CurrentTargetFramework}
+
+
+ """);
+
+ var libPath = Path.Join(libDir, "Lib.cs");
+ var libCode = """
+ namespace Lib;
+ public class LibClass
+ {
+ public static string GetMessage() => "Hello from Lib v1";
+ }
+ """;
+ File.WriteAllText(libPath, libCode);
+
+ var appDir = Path.Join(testInstance.Path, "App");
+ Directory.CreateDirectory(appDir);
+
+ var code = """
+ #:project ../Lib
+ Console.WriteLine("v1 " + Lib.LibClass.GetMessage());
+ """;
+
+ var programPath = Path.Join(appDir, "Program.cs");
+ File.WriteAllText(programPath, code);
+
+ // Remove artifacts from possible previous runs of this test.
+ var artifactsDir = VirtualProjectBuildingCommand.GetArtifactsPath(programPath);
+ if (Directory.Exists(artifactsDir)) Directory.Delete(artifactsDir, recursive: true);
+
+ var programFileName = "App/Program.cs";
+
+ Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v1", programFileName: programFileName);
+
+ // We cannot detect changes in referenced projects, so we always rebuild.
+ Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v1", programFileName: programFileName);
+
+ libCode = libCode.Replace("v1", "v2");
+ File.WriteAllText(libPath, libCode);
+
+ Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v2", programFileName: programFileName);
+ }
+
///
/// Up-to-date checks and optimizations currently don't support other included files.
///