From 8fec9c2162b900fb59a3a3433bbcbc87c5e86777 Mon Sep 17 00:00:00 2001 From: wxr <wxr@hdlchina.com.cn> Date: 星期四, 13 六月 2024 17:52:14 +0800 Subject: [PATCH] 更新了iOS扫码sdk,兼容最新手机系统(17.5.1);增加了阿里云日志服务 --- HDL-ON_Android/HDL-ON_Android.csproj | 15 ++ HDL_ON/UI/UI2/1-HomePage/HomePage.cs | 11 + DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll | 0 DLL/Aliyun.Api.LogService.dll | 0 HDL-ON_iOS/HDL-ON_iOS.csproj | 20 ++ HDL_ON/Common/AliyunLog/AliyunLogInvokeAsync.cs | 173 ++++++++++++++++++++++++ HDL_ON/Common/AliyunLog/AliyunLogClient.cs | 152 +++++++++++++++++++++ HDL_ON/UI/MainPage.cs | 8 + HDL_ON/HDL_ON.projitems | 2 HDL_ON/UI/UI0-Stan/Logic/HdlMessageLogic.cs | 17 ++ 10 files changed, 395 insertions(+), 3 deletions(-) diff --git a/DLL/Aliyun.Api.LogService.dll b/DLL/Aliyun.Api.LogService.dll new file mode 100644 index 0000000..6021ab8 --- /dev/null +++ b/DLL/Aliyun.Api.LogService.dll Binary files differ diff --git a/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll b/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll index 8d81fa4..47131dd 100644 --- a/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll +++ b/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll Binary files differ diff --git a/HDL-ON_Android/HDL-ON_Android.csproj b/HDL-ON_Android/HDL-ON_Android.csproj index 5c1479b..8c3c5b0 100644 --- a/HDL-ON_Android/HDL-ON_Android.csproj +++ b/HDL-ON_Android/HDL-ON_Android.csproj @@ -198,6 +198,9 @@ <Reference Include="HdlEzvizDroid"> <HintPath>..\DLL\Android\HdlEzvizDroid.dll</HintPath> </Reference> + <Reference Include="Aliyun.Api.LogService"> + <HintPath>..\DLL\Aliyun.Api.LogService.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="MainActivity.cs" /> @@ -973,6 +976,18 @@ <PackageReference Include="Square.OkHttp3"> <Version>3.14.4</Version> </PackageReference> + <PackageReference Include="Google.Protobuf"> + <Version>3.5.1</Version> + </PackageReference> + <PackageReference Include="Microsoft.AspNet.WebApi.Client"> + <Version>5.2.4</Version> + </PackageReference> + <PackageReference Include="Iconic.Zlib.Netstandard"> + <Version>1.0.0</Version> + </PackageReference> + <PackageReference Include="lz4net"> + <Version>1.0.15.93</Version> + </PackageReference> </ItemGroup> <ItemGroup> <AndroidAsset Include="Assets\Language.ini" /> diff --git a/HDL-ON_iOS/HDL-ON_iOS.csproj b/HDL-ON_iOS/HDL-ON_iOS.csproj index 87c716b..b3ce1dd 100644 --- a/HDL-ON_iOS/HDL-ON_iOS.csproj +++ b/HDL-ON_iOS/HDL-ON_iOS.csproj @@ -30,6 +30,7 @@ <CodesignProvision>OnPro2307291-Dev</CodesignProvision> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> <MtouchI18n>cjk</MtouchI18n> + <MtouchSdkVersion>17.5</MtouchSdkVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' "> <DebugType>none</DebugType> @@ -55,12 +56,13 @@ <CodesignKey>Apple Development: xuebiao huang (4P32GXQWWK)</CodesignKey> <MtouchDebug>true</MtouchDebug> <MtouchI18n>cjk</MtouchI18n> - <MtouchLink>None</MtouchLink> + <MtouchLink>SdkOnly</MtouchLink> <MtouchExtraArgs>-gcc_flags="-dead_strip -ObjC"</MtouchExtraArgs> <MtouchEnableSGenConc>false</MtouchEnableSGenConc> <CodesignEntitlements>Entitlements.plist</CodesignEntitlements> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> <CodesignProvision>OnPro2307291-Dev</CodesignProvision> +<MtouchSdkVersion>17.5</MtouchSdkVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> <DebugType>none</DebugType> @@ -76,6 +78,7 @@ <MtouchI18n>cjk</MtouchI18n> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> <CodesignProvision>OnPro240130-1-Hoc</CodesignProvision> + <MtouchSdkVersion>17.5</MtouchSdkVersion> </PropertyGroup> <ItemGroup> <Reference Include="System" /> @@ -119,6 +122,9 @@ <Reference Include="Shared.IOS"> <HintPath>..\DLL\Shared.IOS.dll</HintPath> </Reference> + <Reference Include="Aliyun.Api.LogService"> + <HintPath>..\DLL\Aliyun.Api.LogService.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <PackageReference Include="Newtonsoft.Json"> @@ -142,6 +148,18 @@ <PackageReference Include="Xamarin.iOS.SwiftRuntimeSupport"> <Version>0.2.1</Version> </PackageReference> + <PackageReference Include="Google.Protobuf"> + <Version>3.5.1</Version> + </PackageReference> + <PackageReference Include="Microsoft.AspNet.WebApi.Client"> + <Version>5.2.4</Version> + </PackageReference> + <PackageReference Include="Iconic.Zlib.Netstandard"> + <Version>1.0.0</Version> + </PackageReference> + <PackageReference Include="lz4net"> + <Version>1.0.15.93</Version> + </PackageReference> </ItemGroup> <ItemGroup> <ImageAsset Include="Assets.xcassets\add_server1.imageset\add_server1.png" /> diff --git a/HDL_ON/Common/AliyunLog/AliyunLogClient.cs b/HDL_ON/Common/AliyunLog/AliyunLogClient.cs new file mode 100644 index 0000000..5a12209 --- /dev/null +++ b/HDL_ON/Common/AliyunLog/AliyunLogClient.cs @@ -0,0 +1,152 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Aliyun.Api.LogService; +using Aliyun.Api.LogService.Domain.Log; +using Aliyun.Api.LogService.Domain.LogStore.Index; +using Aliyun.Api.LogService.Infrastructure.Protocol; + +namespace HDL_ON.Common.AliyunLog +{ + public class AliyunLogClient + { + // 鏃ュ織鏈嶅姟鐨勬湇鍔℃帴鍏ョ偣銆傛澶勪互鏉窞涓轰緥锛屽叾瀹冨湴鍩熻鏍规嵁瀹為檯鎯呭喌濉啓銆� + private static string endpoint = "cn-hangzhou.log.aliyuncs.com"; + // 鏈ず渚嬩粠鐜鍙橀噺涓幏鍙朅ccessKey ID鍜孉ccessKey Secret銆� + private static string accessKeyId = "LTAI5tLzDxrtsFyi3xtK3YWt"; + private static string accessKeySecret = "eX31JZrRAvC2wZWPiZU0SYhlfAUMoT"; + // Project鍚嶇О銆� + private static string project = "hdl-onpro-log"; + // Logstore鍚嶇О銆� + private static string logstore = "log"; + // 鍒涘缓鏃ュ織鏈嶅姟Client銆� + private static ILogServiceClient client = BuildSimpleClient(); + + public static ILogServiceClient BuildSimpleClient() + => LogServiceClientBuilders.HttpBuilder + .Endpoint(endpoint, project) + .Credential(accessKeyId, accessKeySecret) + .Build(); + + + public AliyunLogClient() + { + } + + + //// 鏋勫缓鏈�绠�鍗曠殑`ILogServiceClient`銆� + //public static ILogServiceClient BuildSimpleClient() + // => LogServiceClientBuilders.HttpBuilder + // // 鏈嶅姟鍏ュ彛<endpoint>鍙婇」鐩悕<projectName> + // .Endpoint(endpoint, project) + // // 璁块棶瀵嗛挜淇℃伅 + // .Credential(accessKeyId, accessKeySecret) + // .Build(); + + + //static async Task Main(string[] args) + //{ + // // 鍒涘缓Project銆� + // var proRes = await client.CreateProjectAsync(project, "des"); + // check(proRes); + // Console.WriteLine("Create project success"); + // Thread.Sleep(120 * 1000); + + // // 鍒涘缓Logstore銆� + // var storeRes = await client.CreateLogStoreAsync(logstore, 3, 2); + // check(storeRes); + // Console.WriteLine("Create logstore success"); + // Thread.Sleep(10 * 1000); + + // // 涓篖ogstore鍒涘缓绱㈠紩銆� + // var indRes = await client.CreateIndexAsync(logstore, new IndexLineInfo(new[] { ' ', ',' })); + // check(indRes); + // Console.WriteLine("Create Index success"); + // Thread.Sleep(60 * 1000); + + // // 鍚慙ogstore鍐欏叆鏁版嵁銆� + // await PostLogs(); + // Console.WriteLine("Post logs success"); + // Thread.Sleep(3000); + // // 鏌ヨ鏃ュ織銆� + // await GetLogs(); + //} + + //public static async Task GetLogs() + //{ + // var logsRes = await client.GetLogsAsync(logstore, DateTimeOffset.UtcNow.AddMinutes(-1), + // DateTimeOffset.UtcNow, + // "test", "", 100, 0); + // check(logsRes); + // foreach (var log in logsRes.Result.Logs) + // { + // foreach (var key in log.Keys) + // { + // log.TryGetValue(key, out var value); + // Console.WriteLine(key + " : " + value); + // } + + // Console.WriteLine("======"); + // } + //} + + public static async Task PostLogs(string topic, string msg) + { + if (client == null) + { + client = BuildSimpleClient(); + } + + try + { + var pushObj = new LogGroupInfo + { + Topic = topic, +#if __ANDROID__ + Source = "Android", +#else + Source = "IOS", +#endif + LogTags = new Dictionary<string, string> + { + {"tag1", DateTime.Now.ToLongTimeString()}, + + }, + Logs = new List<LogInfo> + { + new LogInfo + { + Time = DateTimeOffset.Now, + Contents = new Dictionary<string, string> + { + {"id", DateTime.Now.Ticks.ToString()}, + {"homeid", Entity.DB_ResidenceData.Instance.CurrentRegion.id}, + {"userid", UserInfo.Current.ID}, + {"userName", UserInfo.Current.userName}, + {"message", msg}, + } + } + } + }; + var response = await client.PostLogStoreLogsAsync(logstore, pushObj); + check(response); + } + catch (Exception ex) + { + MainPage.Log(ex.Message); + } + } + + + public static void check(IResponse res) + { + if (!res.IsSuccess) + { + MainPage.Log("鏃ュ織鎺ㄩ�佷笉鎴愬姛."); + //throw new ApplicationException(res.Error.ErrorMessage); + } + } + } +} + diff --git a/HDL_ON/Common/AliyunLog/AliyunLogInvokeAsync.cs b/HDL_ON/Common/AliyunLog/AliyunLogInvokeAsync.cs new file mode 100644 index 0000000..717d3dc --- /dev/null +++ b/HDL_ON/Common/AliyunLog/AliyunLogInvokeAsync.cs @@ -0,0 +1,173 @@ +锘縰sing System; +using System.Linq; +using System.Threading.Tasks; +using Aliyun.Api.LogService; +using Aliyun.Api.LogService.Domain; +using Aliyun.Api.LogService.Domain.Log; +using Aliyun.Api.LogService.Infrastructure.Protocol; + +namespace HDL_ON.Common.AliyunLog +{ + public class AliyunLogInvokeAsync + { + public AliyunLogInvokeAsync() + { + } + + /// <summary> + /// 鎵ц璇锋眰鏂规硶銆� + /// </summary> + public static async Task<GetLogsResult> Invoke(ILogServiceClient client) + { + var response = await client.GetLogsAsync + ( + // 銆屽繀濉弬鏁般�嶄細鍦� Request 鏋勯�犲櫒涓垪鍑猴紝骞朵笖涓嶅彲set锛� + new GetLogsRequest("example-logstore", (Int32)DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(), (Int32)DateTimeOffset.UtcNow.ToUnixTimeSeconds()) + { + // 銆屽彲閫夊弬鏁般�嶄笉浼氬湪 Request 鏋勯�犲櫒涓垪鍑猴紝鍙�氳繃setter璁剧疆銆� + Offset = 1, + Line = 100, + } + ); + + var result = response + // 姝ゆ柟娉曚細纭繚杩斿洖鐨勫搷搴斿け璐ユ椂鍊欐姏鍑篳LogServiceException`銆� + .EnsureSuccess() + // 姝ゅ鑾峰彇Result鏄畨鍏ㄧ殑銆� + .Result; + + Console.WriteLine($"RequestId锛歿response.RequestId}"); + Console.WriteLine($"鏃ュ織鎬绘暟锛歿result.Count}"); + Console.WriteLine($"棣栨潯鏃ュ織锛歿result.Logs.FirstOrDefault()}"); + + return result; + } + + /// <summary> + /// 鍦ㄨ皟鐢ㄦ椂鍙娇鐢ㄦ墿灞曟柟娉曪紝鎵╁睍鏂规硶浼氬皢绠�鍗曠殑璇锋眰瀵硅薄鐨勫睘鎬у睍寮�鍒版柟娉曞叆鍙備腑銆� + /// 浣跨敤鎵╁睍鏂规硶 `using Aliyun.Api.Log;` 鍗冲彲銆� + /// </summary> + public static async Task<GetLogsResult> InvokeUsingExtension(ILogServiceClient client) + { + var response = await client.GetLogsAsync + ( + // 銆屽繀濉弬鏁般�嶄綔涓烘柟娉曠殑鏅�氬繀椤诲弬鏁� + "example-logstore", + DateTimeOffset.UtcNow.AddDays(-1), + DateTimeOffset.UtcNow, + + // 銆屽彲閫夊弬鏁般�嶄綔涓烘柟娉曠殑鍙�夊弬鏁帮紝鍙�氳繃鍛藉悕鍙傛暟鏂瑰紡鎸囧畾 + offset: 1, + line: 10 + ); + + var result = response + // 姝ゆ柟娉曚細纭繚杩斿洖鐨勫搷搴斿け璐ユ椂鍊欐姏鍑篳LogServiceException`銆� + .EnsureSuccess() + // 姝ゅ鑾峰彇Result鏄畨鍏ㄧ殑銆� + .Result; + + Console.WriteLine($"RequestId锛歿response.RequestId}"); + Console.WriteLine($"鏃ュ織鎬绘暟锛歿result.Count}"); + Console.WriteLine($"棣栨潯鏃ュ織锛歿result.Logs.FirstOrDefault()}"); + + return result; + } + + /// <summary> + /// 澶勭悊鏈嶅姟鍣ㄨ繑鍥烇紙鍖呭惈鍦≧esponse涓級鐨勯敊璇�� + /// </summary> + public static async Task<GetLogsResult> InvokeWithErrorHandling(ILogServiceClient client) + { + var response = await client.GetLogsAsync + ( + // 銆屽繀濉弬鏁般�嶄綔涓烘柟娉曠殑鏅�氬繀椤诲弬鏁� + "example-logstore", + DateTimeOffset.UtcNow.AddDays(-1), + DateTimeOffset.UtcNow, + + // 銆屽彲閫夊弬鏁般�嶄綔涓烘柟娉曠殑鍙�夊弬鏁帮紝鍙�氳繃鍛藉悕鍙傛暟鏂瑰紡鎸囧畾 + offset: 1, + line: 10 + ); + + GetLogsResult result; + // 灏濊瘯澶勭悊鍙鐞嗙殑閿欒銆� + if (!response.IsSuccess) + { + // 閿欒鐮� + var errorCode = response.Error.ErrorCode; + // 閿欒娑堟伅 + var errorMessage = response.Error.ErrorMessage; + + Console.WriteLine($"RequestId锛歿response.RequestId}"); + Console.WriteLine($"閿欒鐮侊細{errorCode}"); + Console.WriteLine($"閿欒淇℃伅锛歿errorMessage}"); + + // `ErrorCode`绫诲彲鏀寔涓庤嚜韬疄渚嬫垨瀛楃涓茶繘琛屽姣斻�� + if (errorCode == ErrorCode.SignatureNotMatch /* SDK涓瀹氫箟鐨勯敊璇爜 */) + { + // 鍦ㄨ繖閲屽鐞嗕笟鍔″彲澶勭悊鐨勯敊璇�傘�傘�傘�傘�傘�� + Console.WriteLine("Signature not match, {0}.", errorMessage); + } + else if (errorCode == "ParameterInvalid" /* 涓氬姟鐩稿叧鐗规畩鐨凷DK涓湭瀹氫箟鐨勯敊璇爜 */) + { + // 鍦ㄨ繖閲屽鐞嗕笟鍔″彲澶勭悊鐨勯敊璇�傘�傘�傘�傘�傘�� + Console.WriteLine("Parameter invalid, {0}.", errorMessage); + } + + // 浠讳綍澶勭悊涓嶅埌鐨勯敊璇鍔″繀鎶涘嚭寮傚父涓柇鍘熸祦绋嬶紝閬垮厤澶栭儴鑾峰彇鍒� null 鐨勭粨鏋滐紒 + throw new Exception("杩欓噷鍙互鏄郴缁熺殑涓氬姟寮傚父銆�" + response.Error /* 鏈�濂藉甫涓婃湇鍔¤繑鍥炵殑閿欒淇℃伅浠ヤ究璋冭瘯 */); + } + else + { + // 姝ゅ鑾峰彇Result鏄畨鍏ㄧ殑銆� + result = response.Result; + } + + Console.WriteLine($"RequestId锛歿response.RequestId}"); + Console.WriteLine($"鏃ュ織鎬绘暟锛歿result.Count}"); + Console.WriteLine($"棣栨潯鏃ュ織锛歿result.Logs.FirstOrDefault()}"); + + return result; + } + + /// <summary> + /// 澶勭悊浠ュ紓甯稿舰寮忔姏鍑虹殑閿欒銆� + /// </summary> + public static async Task<GetLogsResult> InvokeWithExceptionHandling(ILogServiceClient client) + { + try + { + return await Invoke(client); + } + catch (LogServiceException e) + { + // 閿欒鐮� + var errorCode = e.ErrorCode; + // 閿欒娑堟伅 + var errorMessage = e.ErrorMessage; + + Console.WriteLine($"RequestId锛歿e.RequestId}"); + Console.WriteLine($"閿欒鐮侊細{errorCode}"); + Console.WriteLine($"閿欒淇℃伅锛歿errorMessage}"); + + // `ErrorCode`绫诲彲鏀寔涓庤嚜韬疄渚嬫垨瀛楃涓茶繘琛屽姣斻�� + if (errorCode == ErrorCode.SignatureNotMatch /* SDK涓瀹氫箟鐨勯敊璇爜 */) + { + // 鍦ㄨ繖閲屽鐞嗕笟鍔″彲澶勭悊鐨勯敊璇�傘�傘�傘�傘�傘�� + Console.WriteLine("Signature not match, {0}.", errorMessage); + } + else if (errorCode == "ParameterInvalid" /* 涓氬姟鐩稿叧鐗规畩鐨凷DK涓湭瀹氫箟鐨勯敊璇爜 */) + { + // 鍦ㄨ繖閲屽鐞嗕笟鍔″彲澶勭悊鐨勯敊璇�傘�傘�傘�傘�傘�� + Console.WriteLine("Parameter invalid, {0}.", errorMessage); + } + + // 浠讳綍澶勭悊涓嶅埌鐨勯敊璇鍔″繀鎶涘嚭寮傚父涓柇鍘熸祦绋嬶紝閬垮厤澶栭儴鑾峰彇鍒� null 鐨勭粨鏋滐紒 + throw new Exception("杩欓噷鍙互鏄郴缁熺殑涓氬姟寮傚父銆�", e /* 鍦ㄨ嚜瀹氫箟鐨勫紓甯镐腑鏈�濂藉甫涓婃湇鍔¤繑鍥炵殑寮傚父浠ヤ究璋冭瘯 */); + } + } + } +} + diff --git a/HDL_ON/HDL_ON.projitems b/HDL_ON/HDL_ON.projitems index 5ea2e77..59a87d6 100644 --- a/HDL_ON/HDL_ON.projitems +++ b/HDL_ON/HDL_ON.projitems @@ -594,6 +594,8 @@ <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Automation\Constant.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Scene\SceneAutomationListChoosePage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Scene\SceneTargetTypeChoosePage.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Common\AliyunLog\AliyunLogClient.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Common\AliyunLog\AliyunLogInvokeAsync.cs" /> </ItemGroup> <ItemGroup> <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" /> diff --git a/HDL_ON/UI/MainPage.cs b/HDL_ON/UI/MainPage.cs index b56522b..ed56fc1 100644 --- a/HDL_ON/UI/MainPage.cs +++ b/HDL_ON/UI/MainPage.cs @@ -649,6 +649,14 @@ { #if DEBUG Console.WriteLine($"{tag}-->{msg}"); + if (tag == "error") + { + new System.Threading.Thread(async () => + { + await Common.AliyunLog.AliyunLogClient.PostLogs("鑷畾涔塃rror鏃ュ織", msg); + }) + { IsBackground = true }.Start(); + } #endif } diff --git a/HDL_ON/UI/UI0-Stan/Logic/HdlMessageLogic.cs b/HDL_ON/UI/UI0-Stan/Logic/HdlMessageLogic.cs index 6a0f24c..b69b97c 100644 --- a/HDL_ON/UI/UI0-Stan/Logic/HdlMessageLogic.cs +++ b/HDL_ON/UI/UI0-Stan/Logic/HdlMessageLogic.cs @@ -89,7 +89,14 @@ form.AddForm(string.Empty); form.SetTextContent(msg); - }, "ok"); + }, "ok"); + + //涓婃姤鏃ュ織鏈嶅姟鍣� + new System.Threading.Thread(async () => + { + await Common.AliyunLog.AliyunLogClient.PostLogs("App绋嬪簭閿欒", ex.Message); + }) + { IsBackground = true }.Start(); } /// <summary> @@ -104,7 +111,13 @@ form.AddForm(string.Empty); form.SetTextContent(msg); - }, "ok"); + }, "ok"); + //涓婃姤鏃ュ織鏈嶅姟鍣� + new System.Threading.Thread(async () => + { + await Common.AliyunLog.AliyunLogClient.PostLogs("App绋嬪簭閿欒", msg); + }) + { IsBackground = true }.Start(); } diff --git a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs index 03de85a..9c4f0e5 100644 --- a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs +++ b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs @@ -553,6 +553,17 @@ LoadContentView(); #endregion + +#if DEBUG + btnResidenceName.MouseUpEventHandler = (envent, ee) => { + MainPage.Log("sss"); + new System.Threading.Thread(async() => + { + await Common.AliyunLog.AliyunLogClient.PostLogs("鍛婅娴嬭瘯", "娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅娴嬭瘯淇℃伅"); + }) + { IsBackground = true }.Start(); + }; +#endif } catch (Exception ex) { -- Gitblit v1.8.0