私は何日も検索し、見つけることができるすべてを試しましたが、まだこれを機能させることができません.
詳細: 管理されていない dll を呼び出すサード パーティの株式取引アプリがあります。dll が処理/フィルター処理してグローバル リング バッファーに保存するデータを提供しています。リング バッファは、長さが 100 の構造体の配列です。これらはすべて、株式取引アプリのプロセスで実行されます。
また、グローバル リング バッファー内の情報を可能な限り迅速かつ効率的に取得する必要がある別のプロセスで、同じ dll を呼び出すマネージド C# アプリもあります。配列内の最初の構造のデータしか取得できないことを除いて、すべてが機能します。また、C# から dll を呼び出した後、C# コードは arrayMD が構造体の配列であることを認識しなくなり、デバッガーに単純な構造として表示されます。問題の原因はdllのmemcpyでしょうか?[In, Out]、IntPtr、および Marchal.PtrToStructure の組み合わせであらゆる種類の組み合わせを試しました。私は大いに怒り狂っています。どんな助けでも大歓迎です。
ありがとう
これが私が試みていることです。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);