Ejemplo n.º 1
0
        /// <summary>
        ///  処理を実行します。
        /// </summary>
        /// <param name="msg">呼び出し元を表すメッセージです。</param>
        /// <returns>戻り値を表すメッセージです。</returns>
        public override IMessage Invoke(IMessage msg)
        {
            IMessage result = null;

            if (msg is IConstructionCallMessage ctor)               // コンストラクタの場合
            // 特殊な処理
            {
                _behavior.PreInitializer(_serverType, ctor);

                // コンストラクタ呼び出し
                var rp = RemotingServices.GetRealProxy(_target);
                rp.InitializeServerObject(ctor);
                var tp = this.GetTransparentProxy() as MarshalByRefObject;
                result = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor, tp);

                // 特殊な処理
                _behavior.PostInitializer(_serverType, ctor);
            }
            else if (msg is IMethodCallMessage func)                 // 通常関数の場合
            // 特殊な処理
            {
                _behavior.PreCallMethod(_serverType, func);

                // 通常関数呼び出し
                result = RemotingServices.ExecuteMessage(_target, func);

                // 特殊な処理
                _behavior.PostCallMethod(_serverType, func);
            }
            else
            {
                // 呼び出しが不正
                result = _behavior.HandleInvalidCall(_serverType, msg);
            }

            return(result);
        }