Application.xaml.vb 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. Imports System.Net
  2. Imports System.Reflection
  3. Imports System.Windows.Threading
  4. Public Class Application
  5. #If DEBUG Then
  6. ''' <summary>
  7. ''' 用于开始程序时的一些测试。
  8. ''' </summary>
  9. Private Sub Test()
  10. Try
  11. ModDevelop.Start()
  12. Catch ex As Exception
  13. Log(ex, "开发者模式测试出错", LogLevel.Feedback)
  14. End Try
  15. End Sub
  16. #End If
  17. '开始
  18. Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
  19. ApplicationStartTick = GetTimeTick()
  20. SecretOnApplicationStart()
  21. Try
  22. '检查参数调用
  23. If e.Args.Length > 0 Then
  24. If e.Args(0) = "--update" Then
  25. '自动更新
  26. UpdateReplace(e.Args(1), e.Args(2).Trim(""""), e.Args(3).Trim(""""), e.Args(4))
  27. Environment.[Exit](Result.Cancel)
  28. Exit Sub
  29. ElseIf e.Args(0) = "--link" Then
  30. '稍作等待后切换到联机页面
  31. Thread.Sleep(1000)
  32. FormMain.IsLinkRestart = True
  33. #If DEBUG Then
  34. ElseIf e.Args(0) = "--make" Then
  35. '制作更新包
  36. UpdateMake(e.Args(1))
  37. Environment.[Exit](Result.Cancel)
  38. Exit Sub
  39. #End If
  40. End If
  41. End If
  42. '初始化文件结构
  43. Directory.CreateDirectory(Path & "PCL\Pictures")
  44. Directory.CreateDirectory(Path & "PCL\Musics")
  45. Try
  46. Directory.CreateDirectory(PathTemp)
  47. If Not CheckPermission(PathTemp) Then Throw New Exception("PCL2 没有对 " & PathTemp & " 的访问权限")
  48. Catch ex As Exception
  49. MyMsgBox("手动设置的缓存文件夹不可用,PCL2 将使用默认缓存文件夹。" & vbCrLf & "错误原因:" & GetString(ex, False), "缓存文件夹不可用")
  50. Setup.Set("SystemSystemCache", "")
  51. PathTemp = IO.Path.GetTempPath() & "PCL\"
  52. End Try
  53. Directory.CreateDirectory(PathTemp & "Cache")
  54. Directory.CreateDirectory(PathTemp & "Download")
  55. '检测单例
  56. #If Not DEBUG Then
  57. Dim WindowHwnd As IntPtr = FindWindow(Nothing, "Plain Craft Launcher 2 ")
  58. If WindowHwnd <> IntPtr.Zero Then
  59. '将已有的 PCL2 窗口拖出来
  60. ShowWindowToTop(WindowHwnd)
  61. '播放提示音并退出
  62. Beep()
  63. Environment.[Exit](Result.Cancel)
  64. Exit Sub
  65. End If
  66. #End If
  67. '设置初始窗口
  68. If Setup.Get("UiLauncherLogo") AndAlso Not FormMain.IsLinkRestart Then
  69. FrmStart = New SplashScreen("Images\icon.ico")
  70. FrmStart.Show(False, True)
  71. End If
  72. '动态 DLL 调用
  73. AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf AssemblyResolve
  74. '日志初始化
  75. LogStart()
  76. '添加日志
  77. Log("[Start] 程序版本:" & VersionDisplayName & "(" & VersionCode & ")")
  78. Log("[Start] 识别码:" & UniqueAddress & If(ThemeCheckOne(9), ",已解锁反馈主题", ""))
  79. Log("[Start] 程序路径:" & PathWithName)
  80. '检测压缩包运行
  81. If Path.Contains(IO.Path.GetTempPath()) OrElse Path.Contains("AppData\Local\Temp\") Then
  82. MyMsgBox("PCL2 正在临时文件夹运行,设置、游戏存档等很可能无法保存,且部分功能会无法使用或出错。" & vbCrLf & "请将 PCL2 从压缩文件中解压,或是更换文件夹后再继续使用!", "环境警告", "我知道了", IsWarn:=True)
  83. End If
  84. '设置初始化
  85. Setup.Load("SystemDebugMode")
  86. Setup.Load("SystemDebugAnim")
  87. Setup.Load("ToolDownloadThread")
  88. '网络配置初始化
  89. ServicePointManager.Expect100Continue = True
  90. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
  91. ServicePointManager.DefaultConnectionLimit = 1024
  92. ServicePointManager.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(Function() As Boolean
  93. Return True
  94. End Function)
  95. '计时
  96. Log("[Start] 第一阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms")
  97. ApplicationStartTick = GetTimeTick()
  98. '执行测试
  99. #If DEBUG Then
  100. Test()
  101. #End If
  102. AniControlEnabled += 1
  103. Catch ex As Exception
  104. MsgBox(GetString(ex, False, True), MsgBoxStyle.Critical, "PCL2 初始化错误")
  105. FormMain.EndProgramForce(Result.Exception)
  106. End Try
  107. End Sub
  108. '结束
  109. Private Sub Application_SessionEnding(sender As Object, e As SessionEndingCancelEventArgs) Handles Me.SessionEnding
  110. FrmMain.EndProgram(False)
  111. End Sub
  112. '异常
  113. Private IsCritErrored As Boolean = False
  114. Private Sub Application_DispatcherUnhandledException(sender As Object, e As DispatcherUnhandledExceptionEventArgs) Handles Me.DispatcherUnhandledException
  115. On Error Resume Next
  116. e.Handled = True
  117. If IsProgramEnded Then Exit Sub
  118. If IsCritErrored Then
  119. '在汇报错误后继续引发错误,知道这次压不住了
  120. FormMain.EndProgramForce(Result.Exception)
  121. Exit Sub
  122. End If
  123. IsCritErrored = True
  124. Dim ExceptionString As String = GetString(e.Exception, False, True)
  125. If ExceptionString.Contains("System.Windows.Threading.Dispatcher.Invoke") OrElse
  126. ExceptionString.Contains("MS.Internal.AppModel.ITaskbarList.HrInit") OrElse
  127. ExceptionString.Contains(".Net Framework") OrElse ' “自动错误判断” 的结果分析
  128. ExceptionString.Contains("未能加载文件或程序集") Then
  129. OpenWebsite("https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net462-offline-installer")
  130. MsgBox("你的 .Net Framework 版本过低或损坏,请在打开的网页中重新下载并安装 .NET Framework 4.6.2 后重试!", MsgBoxStyle.Information, "运行环境错误")
  131. FormMain.EndProgramForce(Result.Cancel)
  132. Else
  133. FeedbackInfo()
  134. Log(e.Exception, "程序出现未知错误", LogLevel.Assert, "锟斤拷烫烫烫")
  135. End If
  136. End Sub
  137. '动态 DLL 调用
  138. Private Shared AssemblyStun As Assembly
  139. Private Shared AssemblyNAudio As Assembly
  140. Private Shared AssemblyJson As Assembly
  141. Private Shared AssemblyDialog As Assembly
  142. Private Shared ReadOnly AssemblyStunLock As New Object
  143. Private Shared ReadOnly AssemblyNAudioLock As New Object
  144. Private Shared ReadOnly AssemblyJsonLock As New Object
  145. Private Shared ReadOnly AssemblyDialogLock As New Object
  146. Public Shared Function AssemblyResolve(sender As Object, args As ResolveEventArgs) As Assembly
  147. If args.Name.StartsWith("NAudio") Then
  148. SyncLock AssemblyNAudioLock
  149. If AssemblyNAudio Is Nothing Then
  150. Log("[Start] 加载 DLL:NAudio")
  151. AssemblyNAudio = Assembly.Load(GetResources("NAudio"))
  152. End If
  153. Return AssemblyNAudio
  154. End SyncLock
  155. ElseIf args.Name.StartsWith("Newtonsoft.Json") Then
  156. SyncLock AssemblyJsonLock
  157. If AssemblyJson Is Nothing Then
  158. Log("[Start] 加载 DLL:Json")
  159. AssemblyJson = Assembly.Load(GetResources("Json"))
  160. End If
  161. Return AssemblyJson
  162. End SyncLock
  163. ElseIf args.Name.StartsWith("Ookii.Dialogs.Wpf") Then
  164. SyncLock AssemblyDialogLock
  165. If AssemblyDialog Is Nothing Then
  166. Log("[Start] 加载 DLL:Dialogs")
  167. AssemblyDialog = Assembly.Load(GetResources("Dialogs"))
  168. End If
  169. Return AssemblyDialog
  170. End SyncLock
  171. ElseIf args.Name.StartsWith("STUN") Then
  172. SyncLock AssemblyStunLock
  173. If AssemblyStun Is Nothing Then
  174. Log("[Start] 加载 DLL:STUN")
  175. AssemblyStun = Assembly.Load(GetResources("STUN"))
  176. End If
  177. Return AssemblyStun
  178. End SyncLock
  179. Else
  180. Return Nothing
  181. End If
  182. End Function
  183. '切换窗口
  184. '控件模板事件
  185. Private Sub MyIconButton_Click(sender As Object, e As EventArgs)
  186. If Setup.Get("LoginType") = McLoginType.Legacy Then
  187. '离线
  188. Dim Names As New List(Of String)
  189. Names.AddRange(Setup.Get("LoginLegacyName").ToString.Split("¨"))
  190. Names.Remove(sender.Tag)
  191. Setup.Set("LoginLegacyName", Join(Names, "¨"))
  192. FrmLoginLegacy.ComboName.ItemsSource = Names
  193. FrmLoginLegacy.ComboName.Text = If(Names.Count > 0, Names(0), "")
  194. Else
  195. '非离线
  196. Dim Token As String = GetStringFromEnum(Setup.Get("LoginType"))
  197. Dim Dict As New Dictionary(Of String, String)
  198. Dim Names As New List(Of String)
  199. Dim Passs As New List(Of String)
  200. If Not Setup.Get("Login" & Token & "Email") = "" Then Names.AddRange(Setup.Get("Login" & Token & "Email").ToString.Split("¨"))
  201. If Not Setup.Get("Login" & Token & "Pass") = "" Then Passs.AddRange(Setup.Get("Login" & Token & "Pass").ToString.Split("¨"))
  202. For i = 0 To Names.Count - 1
  203. Dict.Add(Names(i), Passs(i))
  204. Next
  205. Dict.Remove(sender.Tag)
  206. Setup.Set("Login" & Token & "Email", Join(Dict.Keys.ToArray, "¨"))
  207. Setup.Set("Login" & Token & "Pass", Join(Dict.Values.ToArray, "¨"))
  208. Select Case Token
  209. Case "Mojang"
  210. FrmLoginMojang.ComboName.ItemsSource = Dict.Keys
  211. FrmLoginMojang.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
  212. FrmLoginMojang.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
  213. Case "Nide"
  214. FrmLoginNide.ComboName.ItemsSource = Dict.Keys
  215. FrmLoginNide.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
  216. FrmLoginNide.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
  217. Case "Auth"
  218. FrmLoginAuth.ComboName.ItemsSource = Dict.Keys
  219. FrmLoginAuth.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
  220. FrmLoginAuth.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
  221. Case Else
  222. DebugAssert(True)
  223. Exit Sub
  224. End Select
  225. End If
  226. End Sub
  227. End Class