/// <summary> /// メソッドorプロパティー実行。 /// </summary> /// <param name="async">非同期実行用。</param> /// <param name="varManager">変数管理。</param> /// <param name="info">呼び出し情報。</param> /// <param name="obj">実行対象オブジェクト。</param> /// <param name="args">操作実行引数。</param> /// <param name="method">メソッド情報。</param> /// <returns>戻り情報。</returns> static ReturnInfo ExecuteMethodOrProperty(IAsyncInvoke async, VarPool varManager, ProtocolInfo info, object obj, object[] args, MethodInfo method) { //戻り値 VarAddress handle = null; if (method.ReturnParameter.ParameterType != typeof(void)) { handle = varManager.Add(null); } //番号管理から消されないようにする KeepAlive(varManager, info.Arguments, handle); //非同期実行 async.Execute(delegate { ReturnInfo retInfo = new ReturnInfo(); try { object retObj = method.Invoke(obj, args); if (method.ReturnParameter.ParameterType != typeof(void)) { varManager.SetObject(handle, retObj); } //ref, outの解決 List <object> retArgsTmp = new List <object>(); retArgsTmp.Add(null); //完了通知変数を戻す。しかし、ここではまだ格納しない retArgsTmp.AddRange(args); ReflectArgsAfterInvoke(varManager, info.Arguments, retArgsTmp.ToArray()); } catch (Exception e) { retInfo = new ReturnInfo(new ExceptionInfo(e)); } //完了通知 varManager.SetObject((VarAddress)info.Arguments[0], retInfo); //存命状態を解く FreeKeepAlive(varManager, info.Arguments, handle); }); return(new ReturnInfo(handle)); }
/// <summary> /// 呼び出し後の引数反映。 /// </summary> /// <param name="varManager">変数管理。</param> /// <param name="argsInfo">引数情報。</param> /// <param name="args">引数。</param> internal static void ReflectArgsAfterInvoke(VarPool varManager, object[] argsInfo, object[] args) { if (argsInfo.Length != args.Length) { throw new InternalException(); } for (int i = 0; i < argsInfo.Length; i++) { VarAddress handle = argsInfo[i] as VarAddress; if (handle != null) { varManager.SetObject(handle, args[i]); } } }
/// <summary> /// 値設定処理呼び出し。 /// </summary> /// <param name="varManager">変数管理。</param> /// <param name="info">呼び出し情報。</param> /// <returns>戻り値情報。</returns> static ReturnInfo SetValue(VarPool varManager, ProtocolInfo info) { //引数の数は1であること if (info.Arguments.Length != 1) { throw new InternalException(); } //引数の解決 object[] args; ResolveArgs(varManager, info.Arguments, out args); //値の設定 varManager.SetObject(info.VarAddress, args[0]); return(new ReturnInfo()); }
/// <summary> /// フィールド操作実行。 /// </summary> /// <param name="async">非同期実行用。</param> /// <param name="varManager">変数管理。</param> /// <param name="info">呼び出し情報。</param> /// <param name="obj">実行対象オブジェクト。</param> /// <param name="args">操作実行引数。</param> /// <param name="field">フィールド情報。</param> /// <returns>戻り情報。</returns> static ReturnInfo ExecuteField(IAsyncInvoke async, VarPool varManager, ProtocolInfo info, object obj, object[] args, FieldInfo field) { //get if (args.Length == 0) { //戻り値格納用 VarAddress getVar = varManager.Add(null); //番号管理から消されないようにする KeepAlive(varManager, info.Arguments, getVar); //非同期実行 async.Execute(delegate { ReturnInfo retInfo = new ReturnInfo(); try { varManager.SetObject(getVar, field.GetValue(obj)); } catch (Exception e) { retInfo = new ReturnInfo(new ExceptionInfo(e)); } //完了通知 varManager.SetObject((VarAddress)info.Arguments[0], retInfo); //存命状態を解く FreeKeepAlive(varManager, info.Arguments, getVar); }); return(new ReturnInfo(getVar)); } //set else if (args.Length == 1) { //番号管理から消されないようにする KeepAlive(varManager, info.Arguments, null); //非同期実行 async.Execute(delegate { ReturnInfo retInfo = new ReturnInfo(); try { field.SetValue(obj, args[0]); } catch (Exception e) { retInfo = new ReturnInfo(new ExceptionInfo(e)); } //完了通知 varManager.SetObject((VarAddress)info.Arguments[0], retInfo); //存命状態を解く FreeKeepAlive(varManager, info.Arguments, null); }); return(new ReturnInfo()); } throw new InternalException(); }