如何将数据从 C# 传递到 C++(只是指针,没有封送)
how to pass data from c# to c++ (just pointer, no marshalling)
我的应用程序包含两端 - C++ 上的客户端和 C# 上的服务器端。我需要客户端以尽可能低的延迟接收结构。所以我希望它接收指向结构的指针并避免封送。结构是这样的:
struct OrderAction
{
OrderActionType actionType;
uint UserId;
int OrdersExecutorId;
int InstrumentId;
int StrategyId;
....
所以我想我想这样做:
- 服务器 c# 端将指针传递到客户端 c++ 端。
- 在 c++ 端通过接收的指针读取和处理结构。
- 如果需要,在 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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错