Я стартер ICE. В http://zeroc.com есть хорошее руководство по созданию чата. Я решил использовать учебник как базу. И первое, что я пытался сделать, это написать класс ChatRoom в C# вместо данной реализации C++. Я попытался сделать то же самое в моем коде C#. Реализация Chatroom в C++:Ice Chat Application
// C++
class ChatRoomCallbackAdapter { /* ... */ };
typedef IceUtil::Handle<ChatRoomCallbackAdapter> ChatRoomCallbackAdapterPtr;
class ChatRoom : public IceUtil::Shared
{
public:
ChatRoom(bool trace, const Ice::LoggerPtr& logger);
void reserve(const std::string&);
void unreserve(const std::string&);
void join(const std::string&, const ChatRoomCallbackAdapterPtr&);
void leave(const std::string&);
Ice::Long send(const std::string&, const std::string&);
private:
typedef std::map<std::string, ChatRoomCallbackAdapterPtr> ChatRoomCallbackMap;
ChatRoomCallbackMap _members;
std::set<std::string> _reserved;
IceUtil::Mutex _mutex;
const bool _trace;
const Ice::LoggerPtr _logger;
};
Некоторой часть реализации класс-члены:
// ...
void ChatRoom::reserve(const string& name)
{
IceUtil::Mutex::Lock sync(_mutex);
if(_reserved.find(name) != _reserved.end() ||
_members.find(name) != _members.end())
{
throw string("The name " + name + " is already in use.");
}
_reserved.insert(name);
}
// ...
Я ПИСЬМЕННЫЙ следующий:
public class ChatRoom : IceUtil
, когда я обнаружил ошибку. Я обнаружил, что DLU IceUtil в дистрибутиве не является COM-видимым, поэтому я не могу использовать его в моем проекте C#.
Что можно использовать вместо C++
IceUtil::Handle<T>
, насколько я понимаю, это смарт-указатель. Как я могу реализовать сервер, как тот, который указан в C#?
было бы тем же самым в C# (речь о мьютексах) по сравнению с выше классом C++:
public class ChatRoom
{
// ...
void Reserve(System.String Name)
{
lock(this)
{
// operations
}
}
}
?
Спасибо!
Пожалуйста, переустановите. Я прав насчет блокировки? И что дает наследование от IceUtil :: Shared для ChatRoomClass. Я не знаю, что это в IceUtil :: Shared ... – lexeme
'IceUtil :: Shared' - это базовый класс, который объекты Ice на C++ должны наследовать. Он обеспечивает интерфейс для увеличения и уменьшения контрольного счетчика и некоторых других методов. Это не нужно в C#. Что касается блокировки - да, вам нужно синхронизировать доступ к общим ресурсам, и методы Ice могут быть вызваны из разных потоков параллельно. Единственное, что кажется отсутствующим, это наследование из абстрактного класса CharRoomDisp_'. Этот класс должен быть создан из файла Ice. Еще раз, сначала прочитайте примеры C#. –
Да, я знаю о слугах и объектах сервера ... эта вещь, которую я прочитал, тонита. Благодаря! Я собираюсь бороться с этим)) – lexeme