冰聊应用
我是 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
}
}
}
?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我对 ICE 一无所知,但他们的网站列出了 .NET 实现 - 你为什么不呢如果您想使用 C#,请使用它而不是 COM?甚至还有文档部分,其中包含 C# 服务器示例< /a>.
I don't know anything about ICE, but their website lists a .NET implementation - why don't you use that instead of COM if you want to use C#? There's even a section of documentation with an example of a C# server.
C++ 不支持开箱即用的引用计数指针,这就是为什么 C++ API 具有
IceUtil::Handle
模板。 C#显然不需要它。我建议您开始使用 C# 示例而不是 C++ 来学习 Ice for C#。您可以在 演示包。当然,Ice 与 COM 技术完全无关,只是它是一种替代品。C++ does not support reference counted pointers out of the box, that is why C++ API has
IceUtil::Handle<>
template. C# obviously does not need it. I'd recommend you start learning Ice for C# using C# examples rather than C++. You can find a lot of C# client/server examples indemocs
folder of demos packages. And, of course, Ice has absolutely nothing to do withCOM
technology, except that it is kind of a replacement.