如何将数据从 C# 传递到 C++(只是指针,没有封送)

how to pass data from c# to c++ (just pointer, no marshalling)

本文关键字:指针 C++ 数据      更新时间:2023-10-16

我的应用程序包含两端 - 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 中,我应该在托管内存还是非托管内存中分配结构?
  • 我应该使用什么方法,可能有人可以链接一个示例?

您首先需要仔细检查您的结构是否可 blitable。如果结构不是可拼接的,则无法避免某种形式的封送。就目前而言,考虑到您显示的字段,并假设OrderActionType是一个enum,问题中的结构看起来像是可闪电的。

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

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

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

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

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

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

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

你可以

做的是在你想要调用的本机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