2011-01-18 12 views
1

Я стартер 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 
     } 
    }    
} 

?
Спасибо!

ответ

2

C++ не поддерживает ссылки подсчитанных указателей из коробки, поэтому C++ API имеет шаблон IceUtil::Handle<>. C#, очевидно, не нуждается в этом. Я бы посоветовал вам начать изучать Ice для C#, используя примеры C#, а не C++. Вы можете найти множество примеров клиентов/серверов C# в папке democsdemos packages. И, конечно же, Ice не имеет абсолютно никакого отношения к технологии COM, за исключением того, что это своего рода замена.

+0

Пожалуйста, переустановите. Я прав насчет блокировки? И что дает наследование от IceUtil :: Shared для ChatRoomClass. Я не знаю, что это в IceUtil :: Shared ... – lexeme

+0

'IceUtil :: Shared' - это базовый класс, который объекты Ice на C++ должны наследовать. Он обеспечивает интерфейс для увеличения и уменьшения контрольного счетчика и некоторых других методов. Это не нужно в C#. Что касается блокировки - да, вам нужно синхронизировать доступ к общим ресурсам, и методы Ice могут быть вызваны из разных потоков параллельно. Единственное, что кажется отсутствующим, это наследование из абстрактного класса CharRoomDisp_'. Этот класс должен быть создан из файла Ice. Еще раз, сначала прочитайте примеры C#. –

+0

Да, я знаю о слугах и объектах сервера ... эта вещь, которую я прочитал, тонита. Благодаря! Я собираюсь бороться с этим)) – lexeme

4

Я ничего не знаю о ICE, но их сайт перечисляет .NET implementation - почему бы вам не использовать это вместо COM, если вы хотите использовать C#? Там даже есть section of documentation with an example of a C# server.

+0

осуществление чего? – lexeme

+0

Реализация Ice API. –

+0

Да, я знаю, но он всплывает и не имеет прямого подключения к архитектуре приложения Demo Chat. В последнем это кажется более сложным. – lexeme