diff --git a/v2rayN/ServiceLib/Common/Utils.cs b/v2rayN/ServiceLib/Common/Utils.cs index bfc74801..358d4e9a 100644 --- a/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayN/ServiceLib/Common/Utils.cs @@ -331,6 +331,32 @@ public class Utils .ToList(); } + public static Dictionary> ParseHostsToDictionary(string hostsContent) + { + var userHostsMap = hostsContent + .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) + .Select(line => line.Trim()) + // skip full-line comments + .Where(line => !string.IsNullOrWhiteSpace(line) && !line.StartsWith("#")) + // strip inline comments (truncate at '#') + .Select(line => + { + var index = line.IndexOf('#'); + return index >= 0 ? line.Substring(0, index).Trim() : line; + }) + // ensure line still contains valid parts + .Where(line => !string.IsNullOrWhiteSpace(line) && line.Contains(' ')) + .Select(line => line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)) + .Where(parts => parts.Length >= 2) + .GroupBy(parts => parts[0]) + .ToDictionary( + group => group.Key, + group => group.SelectMany(parts => parts.Skip(1)).ToList() + ); + + return userHostsMap; + } + #endregion 转换函数 #region 数据检查 diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs index 2f0f8015..306572a1 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxDnsService.cs @@ -94,17 +94,7 @@ public partial class CoreConfigSingboxService if (!simpleDNSItem.Hosts.IsNullOrEmpty()) { - var userHostsMap = simpleDNSItem.Hosts - .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) - .Select(line => line.Trim()) - .Where(line => !string.IsNullOrWhiteSpace(line) && line.Contains(' ')) - .Select(line => line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)) - .Where(parts => parts.Length >= 2) - .GroupBy(parts => parts[0]) - .ToDictionary( - group => group.Key, - group => group.SelectMany(parts => parts.Skip(1)).ToList() - ); + var userHostsMap = Utils.ParseHostsToDictionary(simpleDNSItem.Hosts); foreach (var kvp in userHostsMap) { diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs index 24804c50..0b364785 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs @@ -71,6 +71,31 @@ public partial class CoreConfigSingboxService }); } + var hostsDomains = new List(); + var systemHostsMap = Utils.GetSystemHosts(); + foreach (var kvp in systemHostsMap) + { + hostsDomains.Add(kvp.Key); + } + var dnsItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box); + if (dnsItem == null || dnsItem.Enabled == false) + { + var simpleDNSItem = _config.SimpleDNSItem; + if (!simpleDNSItem.Hosts.IsNullOrEmpty()) + { + var userHostsMap = Utils.ParseHostsToDictionary(simpleDNSItem.Hosts); + foreach (var kvp in userHostsMap) + { + hostsDomains.Add(kvp.Key); + } + } + } + singboxConfig.route.rules.Add(new() + { + action = "resolve", + domain = hostsDomains, + }); + singboxConfig.route.rules.Add(new() { outbound = Global.DirectTag, diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayDnsService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayDnsService.cs index 6f64e923..744286d4 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayDnsService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayDnsService.cs @@ -261,17 +261,7 @@ public partial class CoreConfigV2rayService if (!simpleDNSItem.Hosts.IsNullOrEmpty()) { - var userHostsMap = simpleDNSItem.Hosts - .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) - .Select(line => line.Trim()) - .Where(line => !string.IsNullOrWhiteSpace(line) && line.Contains(' ')) - .Select(line => line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)) - .Where(parts => parts.Length >= 2) - .GroupBy(parts => parts[0]) - .ToDictionary( - group => group.Key, - group => group.SelectMany(parts => parts.Skip(1)).ToList() - ); + var userHostsMap = Utils.ParseHostsToDictionary(simpleDNSItem.Hosts); foreach (var kvp in userHostsMap) {