我是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
}
}
}
?
谢谢!
答案 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 packages的democs
文件夹中找到许多C#客户端/服务器示例。当然,Ice与COM
技术完全无关,只不过它是一种替代品。