/// <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();
        }