diff --git a/v2rayN/Directory.Build.props b/v2rayN/Directory.Build.props
index 7d8defbd..01ab2f78 100644
--- a/v2rayN/Directory.Build.props
+++ b/v2rayN/Directory.Build.props
@@ -8,7 +8,6 @@
net10.0
true
true
- CA1031;CS1591;NU1507;CA1416;IDE0058;IDE0053;IDE0200
annotations
enable
2dust
diff --git a/v2rayN/Directory.Packages.props b/v2rayN/Directory.Packages.props
index 37e08fbd..521afe14 100644
--- a/v2rayN/Directory.Packages.props
+++ b/v2rayN/Directory.Packages.props
@@ -33,6 +33,6 @@
-
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib.Tests/CoreConfig/Context/CoreConfigContextBuilderTests.cs b/v2rayN/ServiceLib.Tests/CoreConfig/Context/CoreConfigContextBuilderTests.cs
index ee329845..10531092 100644
--- a/v2rayN/ServiceLib.Tests/CoreConfig/Context/CoreConfigContextBuilderTests.cs
+++ b/v2rayN/ServiceLib.Tests/CoreConfig/Context/CoreConfigContextBuilderTests.cs
@@ -99,7 +99,8 @@ public class CoreConfigContextBuilderTests
{
return message.Contains("cycle dependency", StringComparison.OrdinalIgnoreCase)
|| message.Contains("循环依赖", StringComparison.Ordinal)
- || message.Contains("循環依賴", StringComparison.Ordinal);
+ || message.Contains("循環依賴", StringComparison.Ordinal)
+ || message.Contains("циклическую зависимость", StringComparison.OrdinalIgnoreCase);
}
private static async Task UpsertProfilesAsync(params ProfileItem[] profiles)
diff --git a/v2rayN/ServiceLib/Common/Utils.cs b/v2rayN/ServiceLib/Common/Utils.cs
index c0d8816d..9c2bd4af 100644
--- a/v2rayN/ServiceLib/Common/Utils.cs
+++ b/v2rayN/ServiceLib/Common/Utils.cs
@@ -864,15 +864,25 @@ public class Utils
public static Dictionary GetSystemHosts()
{
- var hosts = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts");
- var hostsIcs = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts.ics");
-
- foreach (var (key, value) in hostsIcs)
+ if (IsWindows())
{
- hosts[key] = value;
+ var hosts = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts");
+ var hostsIcs = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts.ics");
+
+ foreach (var (key, value) in hostsIcs)
+ {
+ hosts[key] = value;
+ }
+
+ return hosts;
}
- return hosts;
+ if (IsLinux() || IsMacOS())
+ {
+ return GetSystemHosts("/etc/hosts");
+ }
+
+ return new Dictionary();
}
public static async Task GetCliWrapOutput(string filePath, string? arg)
@@ -1114,12 +1124,16 @@ public class Utils
#region Platform
+ [SupportedOSPlatformGuard("windows")]
public static bool IsWindows() => OperatingSystem.IsWindows();
+ [SupportedOSPlatformGuard("linux")]
public static bool IsLinux() => OperatingSystem.IsLinux();
+ [SupportedOSPlatformGuard("macos")]
public static bool IsMacOS() => OperatingSystem.IsMacOS();
+ [UnsupportedOSPlatformGuard("windows")]
public static bool IsNonWindows() => !OperatingSystem.IsWindows();
public static string GetExeName(string name)
@@ -1214,6 +1228,16 @@ public class Utils
}
public static bool SetUnixFileMode(string? fileName)
+ {
+ if (IsWindows())
+ {
+ return false;
+ }
+ return SetUnixFileModeInternal(fileName);
+ }
+
+ [UnsupportedOSPlatform("windows")]
+ private static bool SetUnixFileModeInternal(string? fileName)
{
try
{
diff --git a/v2rayN/ServiceLib/Common/WindowsUtils.cs b/v2rayN/ServiceLib/Common/WindowsUtils.cs
index 6cd47f0a..5792dcec 100644
--- a/v2rayN/ServiceLib/Common/WindowsUtils.cs
+++ b/v2rayN/ServiceLib/Common/WindowsUtils.cs
@@ -2,6 +2,7 @@ using Microsoft.Win32;
namespace ServiceLib.Common;
+[SupportedOSPlatform("windows")]
internal static class WindowsUtils
{
private static readonly string _tag = "WindowsUtils";
diff --git a/v2rayN/ServiceLib/GlobalUsings.cs b/v2rayN/ServiceLib/GlobalUsings.cs
index 9d311324..6e051d80 100644
--- a/v2rayN/ServiceLib/GlobalUsings.cs
+++ b/v2rayN/ServiceLib/GlobalUsings.cs
@@ -8,6 +8,7 @@ global using System.Reactive.Disposables;
global using System.Reactive.Linq;
global using System.Reflection;
global using System.Runtime.InteropServices;
+global using System.Runtime.Versioning;
global using System.Security.Cryptography;
global using System.Text;
global using System.Text.Encodings.Web;
diff --git a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs
index bc86cd7f..fd7d7fc9 100644
--- a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs
+++ b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs
@@ -41,6 +41,7 @@ public static class AutoStartupHandler
#region Windows
+ [SupportedOSPlatform("windows")]
private static async Task ClearTaskWindows()
{
var autoRunName = GetAutoRunNameWindows();
@@ -53,6 +54,7 @@ public static class AutoStartupHandler
await Task.CompletedTask;
}
+ [SupportedOSPlatform("windows")]
private static async Task SetTaskWindows()
{
try
@@ -82,6 +84,7 @@ public static class AutoStartupHandler
///
///
///
+ [SupportedOSPlatform("windows")]
public static void AutoStartTaskService(string taskName, string fileName, string description)
{
if (taskName.IsNullOrEmpty())
@@ -124,6 +127,7 @@ public static class AutoStartupHandler
#region Linux
+ [SupportedOSPlatform("linux")]
private static async Task ClearTaskLinux()
{
try
@@ -137,6 +141,7 @@ public static class AutoStartupHandler
await Task.CompletedTask;
}
+ [SupportedOSPlatform("linux")]
private static async Task SetTaskLinux()
{
try
@@ -157,6 +162,7 @@ public static class AutoStartupHandler
}
}
+ [SupportedOSPlatform("linux")]
private static string GetHomePathLinux()
{
var homePath = Path.Combine(Utils.GetHomePath(), ".config", "autostart", $"{Global.AppName}.desktop");
@@ -168,6 +174,7 @@ public static class AutoStartupHandler
#region macOS
+ [SupportedOSPlatform("macos")]
private static async Task ClearTaskOSX()
{
try
@@ -187,6 +194,7 @@ public static class AutoStartupHandler
}
}
+ [SupportedOSPlatform("macos")]
private static async Task SetTaskOSX()
{
try
@@ -204,6 +212,7 @@ public static class AutoStartupHandler
}
}
+ [SupportedOSPlatform("macos")]
private static string GetLaunchAgentPathMacOS()
{
var homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
@@ -212,6 +221,7 @@ public static class AutoStartupHandler
return launchAgentPath;
}
+ [SupportedOSPlatform("macos")]
private static string GenerateLaunchAgentPlist()
{
var exePath = Utils.GetExePath();
diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs
index 4929c72e..14d61d9c 100644
--- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs
+++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs
@@ -1,5 +1,6 @@
namespace ServiceLib.Handler.SysProxy;
+[SupportedOSPlatform("linux")]
public static class ProxySettingLinux
{
private static readonly string _proxySetFileName = $"{Global.ProxySetLinuxShellFileName.Replace(Global.NamespaceSample, "")}.sh";
diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs
index 56fbe24d..b598a06c 100644
--- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs
+++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs
@@ -1,5 +1,6 @@
namespace ServiceLib.Handler.SysProxy;
+[SupportedOSPlatform("macos")]
public static class ProxySettingOSX
{
private static readonly string _proxySetFileName = $"{Global.ProxySetOSXShellFileName.Replace(Global.NamespaceSample, "")}.sh";
diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs
index 8dc2f335..614437d7 100644
--- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs
+++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs
@@ -2,6 +2,7 @@ using static ServiceLib.Handler.SysProxy.ProxySettingWindows.InternetConnectionO
namespace ServiceLib.Handler.SysProxy;
+[SupportedOSPlatform("windows")]
public static class ProxySettingWindows
{
private const string _regPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
diff --git a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs
index 21453591..c525da29 100644
--- a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs
+++ b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs
@@ -88,6 +88,7 @@ public static class SysProxyHandler
}
}
+ [SupportedOSPlatform("windows")]
private static async Task SetWindowsProxyPac(int port)
{
var portPac = AppManager.Instance.GetLocalPort(EInboundProtocol.pac);
diff --git a/v2rayN/ServiceLib/Manager/CoreManager.cs b/v2rayN/ServiceLib/Manager/CoreManager.cs
index c309680a..41d2343b 100644
--- a/v2rayN/ServiceLib/Manager/CoreManager.cs
+++ b/v2rayN/ServiceLib/Manager/CoreManager.cs
@@ -8,6 +8,7 @@ public class CoreManager
private static readonly Lazy _instance = new(() => new());
public static CoreManager Instance => _instance.Value;
private Config _config;
+ [SupportedOSPlatform("windows")]
private WindowsJobService? _processJob;
private ProcessService? _processService;
private ProcessService? _processPreService;
diff --git a/v2rayN/ServiceLib/Services/WindowsJobService.cs b/v2rayN/ServiceLib/Services/WindowsJobService.cs
index ffd4a36a..5bc8f276 100644
--- a/v2rayN/ServiceLib/Services/WindowsJobService.cs
+++ b/v2rayN/ServiceLib/Services/WindowsJobService.cs
@@ -3,6 +3,7 @@ namespace ServiceLib.Services;
///
/// http://stackoverflow.com/questions/6266820/working-example-of-createjobobject-setinformationjobobject-pinvoke-in-net
///
+[SupportedOSPlatform("windows")]
public sealed class WindowsJobService : IDisposable
{
private nint handle = nint.Zero;
diff --git a/v2rayN/v2rayN.Desktop/Common/QRCodeAvaloniaUtils.cs b/v2rayN/v2rayN.Desktop/Common/QRCodeAvaloniaUtils.cs
index 90f60c7f..ba416e71 100644
--- a/v2rayN/v2rayN.Desktop/Common/QRCodeAvaloniaUtils.cs
+++ b/v2rayN/v2rayN.Desktop/Common/QRCodeAvaloniaUtils.cs
@@ -23,6 +23,7 @@ public partial class QRCodeAvaloniaUtils
}
}
+ [SupportedOSPlatform("windows")]
private static byte[]? CaptureScreenWindows()
{
var hdcScreen = IntPtr.Zero;
diff --git a/v2rayN/v2rayN.Desktop/GlobalUsings.cs b/v2rayN/v2rayN.Desktop/GlobalUsings.cs
index 9c28c767..558852d2 100644
--- a/v2rayN/v2rayN.Desktop/GlobalUsings.cs
+++ b/v2rayN/v2rayN.Desktop/GlobalUsings.cs
@@ -5,6 +5,7 @@ global using System.IO;
global using System.Linq;
global using System.Reactive.Disposables.Fluent;
global using System.Reactive.Linq;
+global using System.Runtime.Versioning;
global using System.Text;
global using System.Threading;
global using System.Threading.Tasks;
diff --git a/v2rayN/v2rayN.Desktop/Manager/HotkeyManager.cs b/v2rayN/v2rayN.Desktop/Manager/HotkeyManager.cs
index f803c538..a79573d6 100644
--- a/v2rayN/v2rayN.Desktop/Manager/HotkeyManager.cs
+++ b/v2rayN/v2rayN.Desktop/Manager/HotkeyManager.cs
@@ -8,6 +8,7 @@ public sealed class HotkeyManager
private static readonly Lazy _instance = new(() => new());
public static HotkeyManager Instance = _instance.Value;
private readonly Dictionary _hotkeyTriggerDic = new();
+ [SupportedOSPlatform("windows")]
private GlobalHotKeys.HotKeyManager? _hotKeyManager;
private Config? _config;
@@ -16,6 +17,7 @@ public sealed class HotkeyManager
public bool IsPause { get; set; } = false;
+ [SupportedOSPlatform("windows")]
public void Init(Config config, Action updateFunc)
{
_config = config;
@@ -26,9 +28,14 @@ public sealed class HotkeyManager
public void Dispose()
{
+ if (!Utils.IsWindows())
+ {
+ return;
+ }
_hotKeyManager?.Dispose();
}
+ [SupportedOSPlatform("windows")]
private void Register()
{
if (_config.GlobalHotkeys.Any(t => t.KeyCode > 0) == false)
diff --git a/v2rayN/v2rayN.Desktop/Views/MessageBoxDialog.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MessageBoxDialog.axaml.cs
index 12750144..768a8e1d 100644
--- a/v2rayN/v2rayN.Desktop/Views/MessageBoxDialog.axaml.cs
+++ b/v2rayN/v2rayN.Desktop/Views/MessageBoxDialog.axaml.cs
@@ -4,6 +4,11 @@ namespace v2rayN.Desktop.Views;
public partial class MessageBoxDialog : Window
{
+ public MessageBoxDialog()
+ : this(string.Empty, string.Empty)
+ {
+ }
+
public MessageBoxDialog(string caption, string message)
{
InitializeComponent();
diff --git a/v2rayN/v2rayN/app.manifest b/v2rayN/v2rayN/app.manifest
index 1246cc30..519db8c6 100644
--- a/v2rayN/v2rayN/app.manifest
+++ b/v2rayN/v2rayN/app.manifest
@@ -1,12 +1,5 @@
-
-
- true
- PerMonitorV2
-
-
-
diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj
index 871d2940..9fd0d788 100644
--- a/v2rayN/v2rayN/v2rayN.csproj
+++ b/v2rayN/v2rayN/v2rayN.csproj
@@ -7,6 +7,7 @@
true
Resources\v2rayN.ico
app.manifest
+ PerMonitorV2
7.0
true