Пример #1
0
        public RtdServerWrapper(object rtdServer, string progId)
        {
            // CAREFUL: ProgId passed in might be token used from regular ClassFactory.
            _progId    = progId;
            _rtdServer = rtdServer as IRtdServer;
            if (_rtdServer == null)
            {
                // The RtdServer implements another instance of IRtdServer (maybe from some office PIA).
                // We put together some delegates to call through.
                Type[] itfs = rtdServer.GetType().GetInterfaces();
                foreach (Type itf in itfs)
                {
                    if (itf.GUID == ComAPI.guidIRtdServer)
                    {
                        InterfaceMapping map = rtdServer.GetType().GetInterfaceMap(itf);
                        for (int i = 0; i < map.InterfaceMethods.Length; i++)
                        {
                            MethodInfo mi = map.InterfaceMethods[i];
                            switch (mi.Name)
                            {
                            case "ConnectData":
                                _ConnectData = (delConnectData)Delegate.CreateDelegate(typeof(delConnectData), rtdServer, map.TargetMethods[i]);
                                break;

                            case "DisconnectData":
                                _DisconnectData = (delDisconnectData)Delegate.CreateDelegate(typeof(delDisconnectData), rtdServer, map.TargetMethods[i]);
                                break;

                            case "Heartbeat":
                                _Heartbeat = (delHeartbeat)Delegate.CreateDelegate(typeof(delHeartbeat), rtdServer, map.TargetMethods[i]);
                                break;

                            case "RefreshData":
                                _RefreshData = (delRefreshData)Delegate.CreateDelegate(typeof(delRefreshData), rtdServer, map.TargetMethods[i]);
                                break;

                            case "ServerStart":
                                // ServerStart is tricky because of the parameter type mapping.
                                MethodInfo serverStartMethod = map.TargetMethods[i];
                                _ServerStart = delegate(IRTDUpdateEvent updateEvent)
                                {
                                    return((int)serverStartMethod.Invoke(rtdServer, new object[] { updateEvent }));
                                };
                                break;

                            case "ServerTerminate":
                                _ServerTerminate = (delServerTerminate)Delegate.CreateDelegate(typeof(delServerTerminate), rtdServer, map.TargetMethods[i]);
                                break;
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
 public RtdServerWrapper(object rtdServer, string progId)
 {
     // CAREFUL: ProgId passed in might be token used from regular ClassFactory.
     _progId = progId;
     _rtdServer = rtdServer as IRtdServer;
     if (_rtdServer == null)
     {
         // The RtdServer implements another instance of IRtdServer (maybe from some office PIA).
         // We put together some delegates to call through.
         Type[] itfs = rtdServer.GetType().GetInterfaces();
         foreach (Type itf in itfs)
         {
             if (itf.GUID == ComAPI.guidIRtdServer)
             {
                 InterfaceMapping map = rtdServer.GetType().GetInterfaceMap(itf);
                 for (int i = 0; i < map.InterfaceMethods.Length; i++)
                 {
                     MethodInfo mi = map.InterfaceMethods[i];
                     switch (mi.Name)
                     {
                         case "ConnectData":
                             _ConnectData = (delConnectData)Delegate.CreateDelegate(typeof(delConnectData), rtdServer, map.TargetMethods[i]);
                             break;
                         case "DisconnectData":
                             _DisconnectData = (delDisconnectData)Delegate.CreateDelegate(typeof(delDisconnectData), rtdServer, map.TargetMethods[i]);
                             break;
                         case "Heartbeat":
                             _Heartbeat = (delHeartbeat)Delegate.CreateDelegate(typeof(delHeartbeat), rtdServer, map.TargetMethods[i]);
                             break;
                         case "RefreshData":
                             _RefreshData = (delRefreshData)Delegate.CreateDelegate(typeof(delRefreshData), rtdServer, map.TargetMethods[i]);
                             break;
                         case "ServerStart":
                             // ServerStart is tricky because of the parameter type mapping.
                             MethodInfo serverStartMethod = map.TargetMethods[i];
                             _ServerStart = delegate(IRTDUpdateEvent updateEvent)
                             {
                                 return (int)serverStartMethod.Invoke(rtdServer, new object[] {updateEvent});
                             };
                             break;
                         case "ServerTerminate":
                             _ServerTerminate = (delServerTerminate)Delegate.CreateDelegate(typeof(delServerTerminate), rtdServer, map.TargetMethods[i]);
                             break;
                     }
                 }
             }
         }
     }
 }