2

我的应用程序包含两个方面 - c++ 上的客户端和 c# 上的服务器端。我需要客户端以尽可能低的延迟接收结构。所以我希望它接收一个指向结构的指针并避免编组。结构是这样的:

struct OrderAction
{
    OrderActionType actionType;
    uint UserId;
    int OrdersExecutorId;
    int InstrumentId;
    int StrategyId;
    ....

所以我想我想这样做:

  1. 服务器 c# 端将指针传递给客户端 c++ 端。
  2. 在 c++ 端通过接收到的指针读取和处理结构。
  3. 如果需要,在 c# 端释放资源(删除结构)。

将来我计划用 c++ 服务器端替换 c# 服务器端,所以我希望客户端完全独立。客户不应该知道它是从 c# 调用和使用的。

问题:

  • 我应该使用这个算法吗?
  • 如果是这样,那么在第 1 步我应该在托管内存还是非托管内存中分配结构?
  • 我应该使用什么方法,可能有人可以链接一个例子?
4

3 回答 3

2

您首先需要仔细检查您的结构是否是 blittable。如果结构不是 blittable,那么您将无法避免某种形式的编组。就目前而言,考虑到您显示的字段并假设它OrderActionType是一个enum.

然后你只需要通过 ref 传递结构,它将被固定,然后将固定地址传递给本机代码。

在 C++ 端,代码如下所示:

int __stdcall foo(OrderAction *orderAction)
{
    ....
}

在 C# 方面,它看起来像这样:

[DllImport(@"MyLib.dll")]
static extern int foo(ref OrderAction orderAction);
于 2013-09-24T19:31:37.300 回答
0

这不可能像你描述的那样工作。指针是内存引用。如果您有 ac# 服务器,该结构保存在该机器上的内存中,该结构是本地的。指针不能通过网络传递,但在另一台机器上仍然有用,因为数据没有移动。

我会看看WCF在 Windows 世界中传递数据。如果这不起作用,如果这是基于 Web 的,另一种选择是 JSON。

于 2013-09-24T19:27:57.083 回答
0

您可以做的是在要调用的本机 C++ 代码上编写 C++/CLI 包装器。

托管 C++/CLI 包装器可以提供一种方法,该方法采用对结构的托管引用:

void DoStuff(OrderAction^ action)
{
 //call in the native code
}

编辑:关于 C++/CLI 的一些基本信息(以防万一......)http://en.wikipedia.org/wiki/C%2B%2B/CLI

于 2013-09-24T19:29:09.643 回答