Вообщем есть простое приложение - типа сетевой игры. Один сервер- куча клиентов. Сервер должен знать всех клиентов и постоянно с ними иметь соединение. При создании приложения клиента он должен заргистрировать себя на сервере, мол я тоже буду играть. Сервер должен его занести в свой список и в случае чего, вызывать его методы. Т.е., есть один серверный объект, активируемый на сервере, и много клиентских объектов (по одному на каждого клиента), активируемых на клиенте. Вот ссылки на эти клиентские объекты и должен хранить серверный объект.
| Код | class GameManager: MarshalByRefObject { public void RegisterPlayer(Player pl) { .. //заносим в массив игрока (этот метод будет вызываться на клиенте, а выполняться на сервере)
}
public void MoveAllPlayers() { .. //перебираем массив и вызываем метод Move всех Player's } }
|
| Код | class Player : MarshalByRefObject { public PlayerInfo PlayerInfo;
public Player(string name) { PlayerInfo.Name = Name; PlayerInfo.Top = 100; PlayerInfo.Left = 100; PlayerInfo.Height = 100; PlayerInfo.Width = 100; PlayerInfo.BackColor = Color.Red;
//((GameApp)gameApp).InvokeMember(dlg); } string _Name; public string Name { get { return _Name; } set { _Name = value; } } public void Move(Point coords) { //этот метод может вызваться с сервера (но выполняться на клиенте) и перемещать игрока } }
|
Но во время вызова функции вылетает ошибка: Because of security restrictions, the type System.Runtime.Remoting.ObjRef cannot be accessed. | Код | GameManager gm = (GameManager)Activator.GetObject(typeof(GameManager), "tcp://10.5.2.45:7777/RemoteTimeHost/rt"); RemotingConfiguration.RegisterActivatedClientType(typeof(Player), "tcp://10.5.2.45:7777"); Player pl = new Player("sfs"); gm.RegisterPlayer(pl);..вот тут вылетает експешн
|
Я так понимаю, что косяк в том, что я передаю в кач-ве параметра объект, наследованный от MarshalByRefObject. Ну а как тогда быть? Сереализовать его мне не имеет смысла, он должен управлять клиентом.
|