我想使用“inproc”绑定连接应用程序的 c++ 和 c# 端。 为此,我需要以某种方式共享上下文,因为 c# 和 c++ 各部分应使用相同的上下文。 我怎样才能做到这一点?我正在使用官方的 c++ 和 c# 绑定。
即在 C# 方面,我需要 ZeroMQ.ZmqContext。
在 C++ 方面,我需要 zmq::context_t。
两个实例应该指向相同的上下文,这样我就可以使用“inproc”。
ZContext
有一个 public IntPtr ContextPtr { get; }
字段。
Albiet 是一种 hacky 方法 - 使用反射似乎是当前访问该字段的唯一方法。除非将 API 添加到 C# 包装器以允许从原始指针进行初始化(并类似地添加所有权 API),否则这似乎是唯一的途径。
可以做这样的事情:
public static class ZContextExtension
{
public static void SetContextPtr(this ZContext context, IntPtr ptr)
{
PropertyInfo propertyInfo = typeof(ZContext).GetProperty("ContextPtr");
if (propertyInfo == null) return;
propertyInfo.SetValue(context, ptr);
}
}
ZContext context = ZContext.Create();
// Terminate to dealloc the current zmq_ctx
context.Terminate(out ZError initialContextCreateError);
// Reflect and assign
context.SetContextPtr(ctx);
// ... do whatever you need to with the shared context ...
// Set the ptr to IntPtr.zero before Disposal
// Note: This can be skipped if the context is expected to be managed/dealloc'd by C#
context.SetContextPtr(IntPtr.zero);
作为旁注:如果能在 ZeroMQ 包装器中从原始指针(使用所有权 API)进行上下文初始化,那就太好了。这对于允许不同语言运行时之间的大量进程间消息传递还有很长的路要走。
希望ZMQ团队能够实现这一点!