【发布时间】:2012-10-24 16:22:56
【问题描述】:
我已经搜索了几天并尝试了我能找到的所有东西,但仍然无法让它工作。
详情: 我有一个第 3 方股票交易应用程序正在调用我的非托管 dll。它提供 dll 处理/过滤然后保存到全局环形缓冲区的数据。环形缓冲区是一个结构数组,长度为 100。所有这些都在股票交易应用程序进程中运行。
我还有一个托管 C# 应用程序在不同的进程中调用相同的 dll,它需要尽可能快速有效地获取全局环形缓冲区中的信息。一切正常,除了我只能获取数组中第一个结构的数据。同样在从 C# 调用 dll 之后,C# 代码不再知道 arrayMD 是一个结构数组,它在调试器中显示为一个简单的结构。难道是dll中的memcpy导致了问题?我用 [In, Out]、IntPtr 和 Marchal.PtrToStructure 组合尝试了各种组合。我非常fubar。任何帮助将不胜感激。
谢谢
这是我正在尝试的。 在dll方面:
struct stMD
{
float Price;
unsigned int PriceDir;
unsigned int PriceDirCnt;
};
// Global memory
#pragma data_seg (".IPC")
bool NewPoint = false; // Flag used to signal a new point.
static stMD aryMD [100] = {{0}};
#pragma data_seg()
void __stdcall RetrieveMD (stMD *LatestMD [])
{
memcpy(*LatestMD, aryMD, sizeof(aryMD));
}
在 C# 方面:
[StructLayout(LayoutKind.Sequential)]
public struct stMD
{
public float Price;
public uint PriceDir;
public uint PriceDirCnt;
};
public static stMD[] arrayMD = new stMD[100];
[DllImport(@"Market.dll")]
public static extern void RetrieveMD(ref stMD[] arrayMD);
RetrieveMD(ref arrayMD);
【问题讨论】:
标签: c# c++ arrays structure marshalling