1

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

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

?
谢谢!

4

2 回答 2

4

我对 ICE 一无所知,但他们的网站列出了一个.NET 实现——如果你想使用 C#,为什么不使用它而不是 COM?甚至还有一段文档带有 C# 服务器的示例

于 2011-01-18T17:20:17.747 回答
2

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

于 2011-01-18T18:45:00.030 回答