如何将数据从c#传递给c ++(只是指针,没有编组)

时间:2013-09-24 19:21:15

标签: c# c++ interop pinvoke

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

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

所以我想我想这样做:

  1. 服务器c#侧向指向客户端c ++端的指针。
  2. 在c ++端通过接收指针读取和处理struct。
  3. 如果需要,在c#side free资源(删除struct)。
  4. 将来我计划用c ++服务器端替换c#服务器端,所以我希望客户端完全独立。客户不应该知道它是从c#调用和使用的。

    问题:

    • 我应该使用这个算法吗?
    • 如果是,那么在步骤1我应该在托管内存或非托管内存中分配结构吗?
    • 我应该使用哪些方法,可能有人可以链接示例?

3 个答案:

答案 0 :(得分:2)

您首先需要仔细检查您的结构是否是blittable。如果结构不是blittable,那么你不能避免某种形式的编组。根据情况,问题中的结构看起来像是blittable,给定您显示的字段,并假设OrderActionTypeenum

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

在C ++方面,代码如下所示:

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

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

[DllImport(@"MyLib.dll")]
static extern int foo(ref OrderAction orderAction);

答案 1 :(得分:0)

这不可能像你描述的那样起作用。指针是内存参考。如果你有一个c#服务器,它保存结构,该结构是该机器上内存的本地结构。指针不能通过Web传递,并且仍然可以在另一台机器上使用,因为数据没有移动。

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

答案 2 :(得分: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