diff --git a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs index 99f65662..9d399616 100644 --- a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs @@ -17,7 +17,7 @@ public static class CoreConfigHandler { result = node.CoreType switch { - ECoreType.mihomo => await new CoreConfigClashService(config).GenerateClientCustomConfig(node, fileName), + ECoreType.mihomo => await new CoreConfigClashService(config, context.IsTunEnabled).GenerateClientCustomConfig(node, fileName), _ => await GenerateClientCustomConfig(node, fileName) }; } diff --git a/v2rayN/ServiceLib/Manager/CoreManager.cs b/v2rayN/ServiceLib/Manager/CoreManager.cs index 04ac4f3c..5e1527df 100644 --- a/v2rayN/ServiceLib/Manager/CoreManager.cs +++ b/v2rayN/ServiceLib/Manager/CoreManager.cs @@ -85,7 +85,7 @@ public class CoreManager await CoreStop(); await Task.Delay(100); - if (Utils.IsWindows() && _config.TunModeItem.EnableTun) + if (Utils.IsWindows() && (mainContext?.IsTunEnabled == true || preContext?.IsTunEnabled == true)) { await Task.Delay(100); await WindowsUtils.RemoveTunDevice(); @@ -222,7 +222,7 @@ public class CoreManager { return; } - if (!preContext.AppConfig.TunModeItem.EnableTun) + if (!preContext.IsTunEnabled) { return; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs index 0f5887a8..ce7e58e3 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs @@ -1,9 +1,11 @@ namespace ServiceLib.Services.CoreConfig; /// -/// Core configuration file processing class +/// Core configuration file processing class. +/// The TUN state is taken as a snapshot so the generated config always agrees +/// with the launch elevation decision (see CoreManager.ShouldRunAsSudo). /// -public class CoreConfigClashService(Config config) +public class CoreConfigClashService(Config config, bool isTunEnabled) { private static readonly string _tag = "CoreConfigClashService"; @@ -102,7 +104,7 @@ public class CoreConfigClashService(Config config) } //enable tun mode - if (config.TunModeItem.EnableTun) + if (isTunEnabled) { var tun = EmbedUtils.GetEmbedText(Global.ClashTunYaml); if (tun.IsNotEmpty()) @@ -171,7 +173,7 @@ public class CoreConfigClashService(Config config) } foreach (var item in mixinContent) { - if (!config.TunModeItem.EnableTun && item.Key == "tun") + if (!isTunEnabled && item.Key == "tun") { continue; }