需求 v2ranN-VLESS 支持了 reality, 基于 xray 内核 v2ranN-HY2 支持了 hy2, 基于 v2ray 内核 reality和hy2都好用, 都需要. 我是在VPS上同时部署了多个协议的(只要用不同的端口, 不冲突就可以了). 在客户端, 我可不想为了换个协议用用, 就要关个软件再开个软件. 那么, 就要在 v2rayn.exe 的目录下同时放 xray.exe 和 v2ray.exe 然后要根据不同的协议来调用不同的内核. 分析 我们先来看看目前的代码逻辑是怎样的. 根据 之前的开发经验 , 我们知道, 启动内核是在 V2rayHandler 模块的 V2rayStart 函数 里的 p.Start () 倒着走读代码, 发现 V2rayFindexe 函数是用来判断启动哪个内核程序的. 逻辑是, 在 lstV2ray 这个列表中取字符串出来, 再拼上 .exe 的后缀, 然后看当前目录有没有这样的文件存在. 而这个 lstV2ray 列表呢. 存着这些. 也就是说, v2rayN 3.29 的原始逻辑是, 当前目录下, 这3个内核的文件, 找到哪个就启动哪个. 那么, 我们要做的是: 建一个"全局"变量, 用于保存 指定的内核程序名称. 在启动内核之前, 要先根据使用的协议来判断是否需要指定内核程序名称. 实践 添加 模板内"全局"的变量 "设为活动服务器" 的功能, 最后启动内核之前, 加个判断内核的函数调用 测速功能. 最后启动内核之前, 加个判断内核的函数调用. 把v2rayN软件设置里面的 outbound 也就是节点信息传进去. 而这个新增的 SetCoreExeByConfig 函数的实现呢. 就是根据节点信息里的特定属性, 判断是否reality协议, 是否hy2协议. 最后一个修改, 在查找内核程序的函数 V2rayFindexe 中, 原来的逻辑是遍历 { "xray", "wv2ray", "v2ray"} 这个列表. 现在修改为, 先构造一个列表. 规则是: 如果指定了内核, 那么列表中只有这个内核程序. 如果没有指定内核, 那么列表和原来的逻辑保持一致, 就是 { "xra