冰聊应用程序

时间:2011-01-18 17:03:43

标签: c# java ice

我是ICE的首发。在http://zeroc.com,有关于如何创建聊天的很好的教程。我决定以教程为基础。我尝试做的第一件事是在c#中编写ChatRoom类而不是给定c ++实现。我试着在我的c#代码中做同样的事情。在c ++中实现ChatRoom:

// 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

当我遇到错误时。我发现分发包中的IceUtil dll不是COM可见的,因此我不能在我的c#项目中使用它。

我可以使用什么代替c ++

IceUtil::Handle<T>

据我所知它是一个智能指针。 我怎样才能实现像c#中给出的服务器?

与上述c ++类相比,c#(谈论互斥体)是否相同:

public class ChatRoom
{
    // ...
    void Reserve(System.String Name)
    {
        lock(this)
        {
            // operations
        }
    }               
}


谢谢!

2 个答案:

答案 0 :(得分:4)

我对ICE一无所知,但他们的网站列出了.NET implementation - 如果你想使用C#,为什么不使用它而不是COM?甚至有section of documentation with an example of a C# server

答案 1 :(得分:2)

C ++不支持开箱即用的引用计数指针,这就是C ++ API具有IceUtil::Handle<>模板的原因。 C#显然不需要它。我建议您使用C#示例而不是C ++开始学习Ice for C#。您可以在demos packagesdemocs文件夹中找到许多C#客户端/服务器示例。当然,Ice与COM技术完全无关,只不过它是一种替代品。