From 9a5c4189f82ae57a22aec027a67a81567a87b2ed Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 28 Oct 2026 15:39:39 +1100 Subject: [PATCH] Split DiffEngineTray into a portable core and a Windows head The first step to a tray on macOS and Linux. DiffEngineTray.Core is everything that is not WinForms: Tracker, both inline hosts, PiperServer, the settings, DebugReport, IssueLauncher and Logging, with the Windows API helpers ProcessEx and FileLockKiller, which compile anywhere and run only on Windows until they have Unix paths. It builds on every platform. DiffEngineTray keeps Program, the menu, the forms, the hot keys, the icons and the Run key, and nothing on Windows changes. Two things crossed between the halves and now go through a seam. AlwaysKill was a static beside the locked file form, and is LockedFilesPolicy's in the core. IssueLauncher asked through a MessageBox; in the core it declines, having no toolkit to ask with, and the head hands it IssueQuestion's box first thing in Main. ProgramEntryPointTest found the tray's entry point through Tracker, which is the core's now, a library with none, so it asks the head's own assembly. The tray package gains DiffEngineTray.Core.dll and nothing else. --- claude.md | 14 +++++++++-- src/DiffEngine.slnx | 4 +++ src/DiffEngine/InternalsVisibleTo.cs | 3 ++- .../AssemblyLocation.cs | 0 .../AsyncTimer.cs | 0 .../DebugReport.cs | 0 .../DiffEngineTray.Core.csproj | 25 +++++++++++++++++++ .../DirectoryLauncher.cs | 0 .../ExceptionHandler.cs | 0 .../FileComparer.cs | 0 .../FileEx.cs | 0 .../FileLockKiller.cs | 0 src/DiffEngineTray.Core/GlobalUsings.cs | 9 +++++++ .../HotKey/HotKey.cs | 0 .../IInlineHost.cs | 0 .../ITrackedFiles.cs | 0 .../IViewerLauncher.cs | 0 src/DiffEngineTray.Core/InternalsVisibleTo.cs | 2 ++ .../IssueLauncher.cs | 20 +++++---------- .../LinkLauncher.cs | 0 .../LockedFiles.cs | 0 src/DiffEngineTray.Core/LockedFilesPolicy.cs | 10 ++++++++ .../LockedFilesResolver.cs | 0 .../LockedFilesResponse.cs | 0 .../LockingProcess.cs | 0 .../Logging.cs | 0 .../OwnedInlineHost.cs | 0 .../Payloads/DeletePayload.cs | 0 .../Payloads/MovePayload.cs | 0 .../PendingSnapshot.cs | 0 .../PiperServer.cs | 0 .../ProcessEx.cs | 0 .../RemoteInlineHost.cs | 0 .../Serializer.cs | 0 .../Settings/Settings.cs | 0 .../Settings/SettingsContext.cs | 0 .../Settings/SettingsHelper.cs | 0 .../TrackedDelete.cs | 0 .../TrackedMove.cs | 0 .../Tracker.cs | 2 +- .../TrayViewerDirectory.cs | 0 .../VersionReader.cs | 0 .../ProgramEntryPointTest.cs | 3 ++- .../TrackerTrackedFilesTest.cs | 6 ++--- src/DiffEngineTray/DiffEngineTray.csproj | 2 ++ src/DiffEngineTray/IssueQuestion.cs | 17 +++++++++++++ src/DiffEngineTray/LockedFilesHandler.cs | 6 ++--- src/DiffEngineTray/Program.cs | 3 ++- .../Settings/OptionsFormLauncher.cs | 2 +- .../Package.DiffEngineTray.verified.txt | 1 + 50 files changed, 101 insertions(+), 28 deletions(-) rename src/{DiffEngineTray => DiffEngineTray.Core}/AssemblyLocation.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/AsyncTimer.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/DebugReport.cs (100%) create mode 100644 src/DiffEngineTray.Core/DiffEngineTray.Core.csproj rename src/{DiffEngineTray => DiffEngineTray.Core}/DirectoryLauncher.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/ExceptionHandler.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/FileComparer.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/FileEx.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/FileLockKiller.cs (100%) create mode 100644 src/DiffEngineTray.Core/GlobalUsings.cs rename src/{DiffEngineTray => DiffEngineTray.Core}/HotKey/HotKey.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/IInlineHost.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/ITrackedFiles.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/IViewerLauncher.cs (100%) create mode 100644 src/DiffEngineTray.Core/InternalsVisibleTo.cs rename src/{DiffEngineTray => DiffEngineTray.Core}/IssueLauncher.cs (82%) rename src/{DiffEngineTray => DiffEngineTray.Core}/LinkLauncher.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/LockedFiles.cs (100%) create mode 100644 src/DiffEngineTray.Core/LockedFilesPolicy.cs rename src/{DiffEngineTray => DiffEngineTray.Core}/LockedFilesResolver.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/LockedFilesResponse.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/LockingProcess.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Logging.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/OwnedInlineHost.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Payloads/DeletePayload.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Payloads/MovePayload.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/PendingSnapshot.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/PiperServer.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/ProcessEx.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/RemoteInlineHost.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Serializer.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Settings/Settings.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Settings/SettingsContext.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Settings/SettingsHelper.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/TrackedDelete.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/TrackedMove.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/Tracker.cs (99%) rename src/{DiffEngineTray => DiffEngineTray.Core}/TrayViewerDirectory.cs (100%) rename src/{DiffEngineTray => DiffEngineTray.Core}/VersionReader.cs (100%) create mode 100644 src/DiffEngineTray/IssueQuestion.cs diff --git a/claude.md b/claude.md index 3095a8e1c..86d8ca690 100644 --- a/claude.md +++ b/claude.md @@ -39,7 +39,7 @@ dotnet run -c Release --project src/DiffEngineViewer.Windows.Benchmarks -- --fil **Target Frameworks:** - DiffEngine library: net462, net472, net48, net6.0, net7.0, net8.0, net9.0, net10.0 (Windows also includes .NET Framework targets) -- DiffEngineTray: net10.0 Windows Forms application +- DiffEngineTray: net10.0 Windows Forms application, on DiffEngineTray.Core (net10.0, every platform) - Tests: net10.0 (net48 on Windows) ## Architecture Overview @@ -677,7 +677,17 @@ the comment there about not caching "nothing staged" asks for. `libX11` is left of them. **DiffEngineTray (`src/DiffEngineTray/`):** -- Windows Forms tray application that handles pending file diffs +- Windows Forms tray application that handles pending file diffs, in two projects. `src/DiffEngineTray.Core` + is everything that is not WinForms - `Tracker`, both inline hosts, `PiperServer`, the settings, + `DebugReport`, `IssueLauncher` and the Windows API helpers `ProcessEx` and `FileLockKiller`, which + compile anywhere and run only on Windows until they have Unix paths - and builds on every + platform, so a macOS or Linux head can be put on it. `src/DiffEngineTray` is the Windows head: + `Program`, the menu, the forms, the hot keys (`KeyRegister`, `KeyName`, which parses into WinForms' + `Keys`), the icons and the Run key. Two seams cross between them. `LockedFilesPolicy.AlwaysKill` is + the core's, and the question a locked file asks is the head's form (`LockedFilesHandler`). + `IssueLauncher.Declined` declines in the core, which has no toolkit to ask with, and the head + hands it `IssueQuestion`'s MessageBox first thing in Main. The core is signed and named in + DiffEngine's `InternalsVisibleTo`, and names the head and the tests in its own - `PiperServer` - TCP server (localhost, 3492) receiving move/delete payloads from DiffEngine. Deliberately a second listener beside the viewer protocol, not debt: its format is frozen (every stable DiffEngine embeds PiperClient, pinned in test projects while the tray updates diff --git a/src/DiffEngine.slnx b/src/DiffEngine.slnx index fff903ef4..54bfc9baa 100644 --- a/src/DiffEngine.slnx +++ b/src/DiffEngine.slnx @@ -84,6 +84,10 @@ + + + + + + net10.0 + false + false + + + + + + + + + + + + diff --git a/src/DiffEngineTray/DirectoryLauncher.cs b/src/DiffEngineTray.Core/DirectoryLauncher.cs similarity index 100% rename from src/DiffEngineTray/DirectoryLauncher.cs rename to src/DiffEngineTray.Core/DirectoryLauncher.cs diff --git a/src/DiffEngineTray/ExceptionHandler.cs b/src/DiffEngineTray.Core/ExceptionHandler.cs similarity index 100% rename from src/DiffEngineTray/ExceptionHandler.cs rename to src/DiffEngineTray.Core/ExceptionHandler.cs diff --git a/src/DiffEngineTray/FileComparer.cs b/src/DiffEngineTray.Core/FileComparer.cs similarity index 100% rename from src/DiffEngineTray/FileComparer.cs rename to src/DiffEngineTray.Core/FileComparer.cs diff --git a/src/DiffEngineTray/FileEx.cs b/src/DiffEngineTray.Core/FileEx.cs similarity index 100% rename from src/DiffEngineTray/FileEx.cs rename to src/DiffEngineTray.Core/FileEx.cs diff --git a/src/DiffEngineTray/FileLockKiller.cs b/src/DiffEngineTray.Core/FileLockKiller.cs similarity index 100% rename from src/DiffEngineTray/FileLockKiller.cs rename to src/DiffEngineTray.Core/FileLockKiller.cs diff --git a/src/DiffEngineTray.Core/GlobalUsings.cs b/src/DiffEngineTray.Core/GlobalUsings.cs new file mode 100644 index 000000000..42996dcad --- /dev/null +++ b/src/DiffEngineTray.Core/GlobalUsings.cs @@ -0,0 +1,9 @@ +global using System.ComponentModel; +global using Microsoft.Win32.SafeHandles; +global using Serilog; +global using System.Text.Json; +global using System.Text.Json.Serialization; +global using System.Diagnostics.CodeAnalysis; +global using System.Net; +global using System.Net.Sockets; +global using System.Reflection; \ No newline at end of file diff --git a/src/DiffEngineTray/HotKey/HotKey.cs b/src/DiffEngineTray.Core/HotKey/HotKey.cs similarity index 100% rename from src/DiffEngineTray/HotKey/HotKey.cs rename to src/DiffEngineTray.Core/HotKey/HotKey.cs diff --git a/src/DiffEngineTray/IInlineHost.cs b/src/DiffEngineTray.Core/IInlineHost.cs similarity index 100% rename from src/DiffEngineTray/IInlineHost.cs rename to src/DiffEngineTray.Core/IInlineHost.cs diff --git a/src/DiffEngineTray/ITrackedFiles.cs b/src/DiffEngineTray.Core/ITrackedFiles.cs similarity index 100% rename from src/DiffEngineTray/ITrackedFiles.cs rename to src/DiffEngineTray.Core/ITrackedFiles.cs diff --git a/src/DiffEngineTray/IViewerLauncher.cs b/src/DiffEngineTray.Core/IViewerLauncher.cs similarity index 100% rename from src/DiffEngineTray/IViewerLauncher.cs rename to src/DiffEngineTray.Core/IViewerLauncher.cs diff --git a/src/DiffEngineTray.Core/InternalsVisibleTo.cs b/src/DiffEngineTray.Core/InternalsVisibleTo.cs new file mode 100644 index 000000000..e657259a9 --- /dev/null +++ b/src/DiffEngineTray.Core/InternalsVisibleTo.cs @@ -0,0 +1,2 @@ +[assembly: InternalsVisibleTo("DiffEngineTray, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f0a8e4bf1639dce01be6592384e7dfc621915b7759fb5cee42ec5d351bcc43460432da1659ee618ca6cab6b8b8e56a5deb5d4ee1a49783d5c2690752502d31ccbfee9b2c697e20359b55ad100cc9370c8e983fd9496f01d761a060d0435bac7243b1832ba95757aa5adbb67df38c213d717b6751e1217cea9fa5c61e9b799dd")] +[assembly: InternalsVisibleTo("DiffEngineTray.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f0a8e4bf1639dce01be6592384e7dfc621915b7759fb5cee42ec5d351bcc43460432da1659ee618ca6cab6b8b8e56a5deb5d4ee1a49783d5c2690752502d31ccbfee9b2c697e20359b55ad100cc9370c8e983fd9496f01d761a060d0435bac7243b1832ba95757aa5adbb67df38c213d717b6751e1217cea9fa5c61e9b799dd")] diff --git a/src/DiffEngineTray/IssueLauncher.cs b/src/DiffEngineTray.Core/IssueLauncher.cs similarity index 82% rename from src/DiffEngineTray/IssueLauncher.cs rename to src/DiffEngineTray.Core/IssueLauncher.cs index ada13f027..23b4bae7f 100644 --- a/src/DiffEngineTray/IssueLauncher.cs +++ b/src/DiffEngineTray.Core/IssueLauncher.cs @@ -87,19 +87,11 @@ Open an issue on GitHub? } /// - /// Puts the question, and answers whether it was declined. A field so that a test process can - /// decline without anybody being asked: the box is modal, on the desktop of whoever is at the - /// machine, and a test run that reached it waited there for a click. + /// Puts the question, and answers whether it was declined. Declined until a head says how to + /// ask, since asking is a box of a toolkit's own: the Windows head hands over a MessageBox + /// (IssueQuestion) as it starts. A field so that a test process can decline without + /// anybody being asked: the box is modal, on the desktop of whoever is at the machine, and a + /// test run that reached it waited there for a click. /// - internal static Func Declined = AskIfOpenIssue; - - static bool AskIfOpenIssue(string text) - { - var result = MessageBox.Show( - text, - "DiffEngineTray Error", - MessageBoxButtons.YesNo, - MessageBoxIcon.Error); - return result == DialogResult.No; - } + internal static Func Declined = _ => true; } \ No newline at end of file diff --git a/src/DiffEngineTray/LinkLauncher.cs b/src/DiffEngineTray.Core/LinkLauncher.cs similarity index 100% rename from src/DiffEngineTray/LinkLauncher.cs rename to src/DiffEngineTray.Core/LinkLauncher.cs diff --git a/src/DiffEngineTray/LockedFiles.cs b/src/DiffEngineTray.Core/LockedFiles.cs similarity index 100% rename from src/DiffEngineTray/LockedFiles.cs rename to src/DiffEngineTray.Core/LockedFiles.cs diff --git a/src/DiffEngineTray.Core/LockedFilesPolicy.cs b/src/DiffEngineTray.Core/LockedFilesPolicy.cs new file mode 100644 index 000000000..b617dadf0 --- /dev/null +++ b/src/DiffEngineTray.Core/LockedFilesPolicy.cs @@ -0,0 +1,10 @@ +/// +/// Whether a move whose target is locked kills what holds it without asking: the +/// AlwaysKillLockingProcesses setting, set at startup and from the Options form, and by the +/// question's own "always" box. Apart from the question, which is a WinForms form in the head, so +/// the tracker can ask this of a head that has none. +/// +static class LockedFilesPolicy +{ + public static bool AlwaysKill { get; set; } +} diff --git a/src/DiffEngineTray/LockedFilesResolver.cs b/src/DiffEngineTray.Core/LockedFilesResolver.cs similarity index 100% rename from src/DiffEngineTray/LockedFilesResolver.cs rename to src/DiffEngineTray.Core/LockedFilesResolver.cs diff --git a/src/DiffEngineTray/LockedFilesResponse.cs b/src/DiffEngineTray.Core/LockedFilesResponse.cs similarity index 100% rename from src/DiffEngineTray/LockedFilesResponse.cs rename to src/DiffEngineTray.Core/LockedFilesResponse.cs diff --git a/src/DiffEngineTray/LockingProcess.cs b/src/DiffEngineTray.Core/LockingProcess.cs similarity index 100% rename from src/DiffEngineTray/LockingProcess.cs rename to src/DiffEngineTray.Core/LockingProcess.cs diff --git a/src/DiffEngineTray/Logging.cs b/src/DiffEngineTray.Core/Logging.cs similarity index 100% rename from src/DiffEngineTray/Logging.cs rename to src/DiffEngineTray.Core/Logging.cs diff --git a/src/DiffEngineTray/OwnedInlineHost.cs b/src/DiffEngineTray.Core/OwnedInlineHost.cs similarity index 100% rename from src/DiffEngineTray/OwnedInlineHost.cs rename to src/DiffEngineTray.Core/OwnedInlineHost.cs diff --git a/src/DiffEngineTray/Payloads/DeletePayload.cs b/src/DiffEngineTray.Core/Payloads/DeletePayload.cs similarity index 100% rename from src/DiffEngineTray/Payloads/DeletePayload.cs rename to src/DiffEngineTray.Core/Payloads/DeletePayload.cs diff --git a/src/DiffEngineTray/Payloads/MovePayload.cs b/src/DiffEngineTray.Core/Payloads/MovePayload.cs similarity index 100% rename from src/DiffEngineTray/Payloads/MovePayload.cs rename to src/DiffEngineTray.Core/Payloads/MovePayload.cs diff --git a/src/DiffEngineTray/PendingSnapshot.cs b/src/DiffEngineTray.Core/PendingSnapshot.cs similarity index 100% rename from src/DiffEngineTray/PendingSnapshot.cs rename to src/DiffEngineTray.Core/PendingSnapshot.cs diff --git a/src/DiffEngineTray/PiperServer.cs b/src/DiffEngineTray.Core/PiperServer.cs similarity index 100% rename from src/DiffEngineTray/PiperServer.cs rename to src/DiffEngineTray.Core/PiperServer.cs diff --git a/src/DiffEngineTray/ProcessEx.cs b/src/DiffEngineTray.Core/ProcessEx.cs similarity index 100% rename from src/DiffEngineTray/ProcessEx.cs rename to src/DiffEngineTray.Core/ProcessEx.cs diff --git a/src/DiffEngineTray/RemoteInlineHost.cs b/src/DiffEngineTray.Core/RemoteInlineHost.cs similarity index 100% rename from src/DiffEngineTray/RemoteInlineHost.cs rename to src/DiffEngineTray.Core/RemoteInlineHost.cs diff --git a/src/DiffEngineTray/Serializer.cs b/src/DiffEngineTray.Core/Serializer.cs similarity index 100% rename from src/DiffEngineTray/Serializer.cs rename to src/DiffEngineTray.Core/Serializer.cs diff --git a/src/DiffEngineTray/Settings/Settings.cs b/src/DiffEngineTray.Core/Settings/Settings.cs similarity index 100% rename from src/DiffEngineTray/Settings/Settings.cs rename to src/DiffEngineTray.Core/Settings/Settings.cs diff --git a/src/DiffEngineTray/Settings/SettingsContext.cs b/src/DiffEngineTray.Core/Settings/SettingsContext.cs similarity index 100% rename from src/DiffEngineTray/Settings/SettingsContext.cs rename to src/DiffEngineTray.Core/Settings/SettingsContext.cs diff --git a/src/DiffEngineTray/Settings/SettingsHelper.cs b/src/DiffEngineTray.Core/Settings/SettingsHelper.cs similarity index 100% rename from src/DiffEngineTray/Settings/SettingsHelper.cs rename to src/DiffEngineTray.Core/Settings/SettingsHelper.cs diff --git a/src/DiffEngineTray/TrackedDelete.cs b/src/DiffEngineTray.Core/TrackedDelete.cs similarity index 100% rename from src/DiffEngineTray/TrackedDelete.cs rename to src/DiffEngineTray.Core/TrackedDelete.cs diff --git a/src/DiffEngineTray/TrackedMove.cs b/src/DiffEngineTray.Core/TrackedMove.cs similarity index 100% rename from src/DiffEngineTray/TrackedMove.cs rename to src/DiffEngineTray.Core/TrackedMove.cs diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray.Core/Tracker.cs similarity index 99% rename from src/DiffEngineTray/Tracker.cs rename to src/DiffEngineTray.Core/Tracker.cs index 8274274db..2049d39c7 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray.Core/Tracker.cs @@ -1115,7 +1115,7 @@ bool ShouldKill(TrackedMove move, LockedFiles locked, AcceptBatch batch) // as locked with "accept from the tray menu" - where the same accept killed without asking. if (move.KillLockingProcess || batch.KillWithoutPrompt || - LockedFilesHandler.AlwaysKill) + LockedFilesPolicy.AlwaysKill) { return true; } diff --git a/src/DiffEngineTray/TrayViewerDirectory.cs b/src/DiffEngineTray.Core/TrayViewerDirectory.cs similarity index 100% rename from src/DiffEngineTray/TrayViewerDirectory.cs rename to src/DiffEngineTray.Core/TrayViewerDirectory.cs diff --git a/src/DiffEngineTray/VersionReader.cs b/src/DiffEngineTray.Core/VersionReader.cs similarity index 100% rename from src/DiffEngineTray/VersionReader.cs rename to src/DiffEngineTray.Core/VersionReader.cs diff --git a/src/DiffEngineTray.Tests/ProgramEntryPointTest.cs b/src/DiffEngineTray.Tests/ProgramEntryPointTest.cs index 607a8e30c..f15f84bba 100644 --- a/src/DiffEngineTray.Tests/ProgramEntryPointTest.cs +++ b/src/DiffEngineTray.Tests/ProgramEntryPointTest.cs @@ -18,7 +18,8 @@ public class ProgramEntryPointTest [Test] public async Task TheEntryPointStartsOnAnStaThread() { - var entryPoint = typeof(Tracker).Assembly.EntryPoint!; + // The Windows head's own assembly. Tracker is the core's, a library with no entry point + var entryPoint = typeof(MenuBuilder).Assembly.EntryPoint!; await Assert.That(entryPoint.GetCustomAttribute()).IsNotNull(); } diff --git a/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs b/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs index 56ead5fa8..edcb9ed66 100644 --- a/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs +++ b/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs @@ -380,9 +380,9 @@ public TrackerTrackedFilesTest() [Test] public async Task AlwaysKillAppliesToAnAcceptArrivingOverTheSocket() { - var previous = LockedFilesHandler.AlwaysKill; + var previous = LockedFilesPolicy.AlwaysKill; // The stored preference, which Program loads into this at startup - LockedFilesHandler.AlwaysKill = true; + LockedFilesPolicy.AlwaysKill = true; try { await File.WriteAllTextAsync(temp, "new"); @@ -409,7 +409,7 @@ public async Task AlwaysKillAppliesToAnAcceptArrivingOverTheSocket() } finally { - LockedFilesHandler.AlwaysKill = previous; + LockedFilesPolicy.AlwaysKill = previous; } } } diff --git a/src/DiffEngineTray/DiffEngineTray.csproj b/src/DiffEngineTray/DiffEngineTray.csproj index 74e937095..f5829d950 100644 --- a/src/DiffEngineTray/DiffEngineTray.csproj +++ b/src/DiffEngineTray/DiffEngineTray.csproj @@ -36,6 +36,8 @@ + +