protected override void Execute(List <GameEntity> entities) { foreach (var entity in entities) { var request = new RequestLoadAssembly(entity.assemblyBytes.Value); LogManager.GetCurrentClassLogger().Info($"Load assembly started... Entity: {entity}"); request.OnFinish += response => { ResponseLoadAssembly responseLoadAssembly = (ResponseLoadAssembly)response; Type compiledType = responseLoadAssembly.CompiledType; entity.ReplaceType(compiledType); LogManager.GetCurrentClassLogger() .Info( $"<Color=Green><b>Loading assembly successful! Time = {responseLoadAssembly.Milliseconds} ms.</b></Color>"); }; request.OnError += s => { //entity.ReplaceType(null); }; } }
private IEnumerator Get() { Assembly assembly = null; Type type = null; byte[] bytes = (byte[])UserData[0]; bool done = false; DateTime start = DateTime.Now; int milliseconds = 0; string errorMessage = null; if (bytes == null) { VRErrorManager.Instance.Show(ErrorHelper.GetErrorDescByCode(Varwin.Errors.ErrorCode.CompileCodeError)); var response = new ResponseLoadAssembly() { LoadedAssembly = null, CompiledType = null, Milliseconds = milliseconds }; ((IRequest)this).OnResponseDone(response); } else { new Thread(() => { try { assembly = Assembly.Load(bytes); type = assembly.ExportedTypes.FirstOrDefault(); milliseconds = (DateTime.Now - start).Milliseconds; } catch (Exception e) { errorMessage = e.Message; } finally { done = true; } }).Start(); while (!done) { yield return(null); } if (!string.IsNullOrEmpty(errorMessage)) { VRErrorManager.Instance.Show(ErrorHelper.GetErrorDescByCode(Varwin.Errors.ErrorCode.RuntimeCodeError)); } if (type == null && !string.IsNullOrEmpty(errorMessage)) { ((IRequest)this).OnResponseError($"Runtime code error! {errorMessage}"); AMQPClient.SendRuntimeErrorMessage(ProjectData.SceneId, 0, 0, errorMessage); } else { var response = new ResponseLoadAssembly() { LoadedAssembly = assembly, CompiledType = type, Milliseconds = milliseconds }; ((IRequest)this).OnResponseDone(response); } } yield return(true); }