/// <summary> /// 获取当前平台信息, 操作系统和处理器架构, 例如 windows, amd64 /// </summary> /// <returns></returns> public static string GetPlatformInfo() { // 不要尝试手动释放CGo的 *C.char指针, 因为golang有自己的内存管理机制, golang采用动态栈, 由golang底层自己释放内存比较安全 var ptr = IntPtr.Zero; if (Environment.OSVersion.Platform == PlatformID.Win32NT) { if (Environment.Is64BitProcess) { ptr = NativeDllWindows64.GetPlatformInfo(); } else { ptr = NativeDllWindows32.GetPlatformInfo(); } } else if (Environment.OSVersion.Platform == PlatformID.Unix) { if (Environment.Is64BitProcess) { ptr = NativeDllLinux64.GetPlatformInfo(); } } // 这里没有中文字符, 所以不需要base64编码处理, 如果有乱码需要在 golang 导出函数中进行base64编码 var platInfoString = Marshal.PtrToStringAnsi(ptr) ?? ""; return(platInfoString); }
/// <summary> /// 启动Trojan go /// config.json将会决定trojan go的工作模式, 比如以客户端, 或者服务器端启动 /// </summary> /// <param name="dir">config.json配置文件的目录</param> /// <param name="isClient">启动模式, 这个参数决定程序会读取哪个配置文件</param> public static void Start(string dir, bool isClient = true) { if (isClient) { var clientConfigFile = dir + "/client.json"; if (!File.Exists(clientConfigFile)) { Console.WriteLine($"{clientConfigFile} 不存在"); } else { var clientConfigJson = File.ReadAllText(clientConfigFile); var runConfigFile = dir + "/config.json"; File.WriteAllText(runConfigFile, clientConfigJson); } } else { var serverConfigFile = dir + "/server.json"; if (!File.Exists(serverConfigFile)) { Console.WriteLine($"{serverConfigFile} 不存在"); } else { var serverConfigJson = File.ReadAllText(serverConfigFile); var runConfigFile = dir + "/config.json"; File.WriteAllText(runConfigFile, serverConfigJson); } } // 中文目录会导致乱码,因为封送字符串是用ANSI编码, 所以需要先base64编码, // *C.char 类型对UTF-8和Unicode支持不太好, GoString更是会导致程序崩溃(我已经在ubuntu和windows中测试过) var b64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(dir)); Console.WriteLine(b64); var ptr = Marshal.StringToHGlobalAnsi(b64); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { if (Environment.Is64BitProcess) { NativeDllWindows64.Start(ptr); } else { NativeDllWindows32.Start(ptr); } } else if (Environment.OSVersion.Platform == PlatformID.Unix) { if (Environment.Is64BitProcess) { NativeDllLinux64.Start(ptr); } } Marshal.FreeHGlobal(ptr); }
/// <summary> /// 停止Trojan go /// </summary> public static void Stop() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { if (Environment.Is64BitProcess) { NativeDllWindows64.Stop(); } else { NativeDllWindows32.Stop(); } } else if (Environment.OSVersion.Platform == PlatformID.Unix) { if (Environment.Is64BitProcess) { NativeDllLinux64.Stop(); } } }