까지 마샬링하는 데 문제가 있습니다. 내가 검색 한 모든 것을 시도했지만 여전히 작동하지 않습니다.구조체 데이터의 배열을 C++에서 C#
세부 사항 : 제 관리되지 않는 dll을 호출하는 타사 주식 거래 애플 리케이션이 있습니다. dll이 처리/필터 한 다음 전역 링 버퍼에 저장하는 데이터를 제공합니다. 링 버퍼는 100 개의 구조체 배열입니다. 이 모든 것은 주식 거래 애플 리케이션 프로세스에서 실행됩니다.
나는 또한 가능한 한 빠르고 효율적으로 글로벌 링 버퍼에 정보를 가져와야하는 다른 프로세스에서 동일한 dll을 호출하는 관리되는 C# 응용 프로그램을 가지고 있습니다. 배열의 첫 번째 구조에 대한 데이터 만 가져올 수 있다는 것을 제외하고는 모두 작동합니다. 또한 C#에서 dll을 호출 한 후 C# 코드는 더 이상 arrayMD가 구조체의 배열임을 알지 못합니다.이 구조체는 간단한 구조로 디버거에 나타납니다. 문제를 일으키는 DLL에서 memcpy가 될 수 있습니까? 필자는 [In, Out], IntPtr 및 Marchal.PtrToStructure 조합과 함께 모든 종류의 조합을 시도했습니다. 나는 크게 후 발적이다. 어떤 도움이라도 대단히 감사하겠습니다.
감사합니다.
다음은 내가 시도한 것입니다. 는 C# 측면에서
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));
}
: dll을 측면에서 는
void __stdcall RetrieveMD (stMDP *LatestMD [])
당신은 크기를 지정하지 :
[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);
아마도 : http://stackoverflow.com/questions/1197181/how-to-marshal-a-variable-sized-array-of-structs-c-sharp-and-c-interop-help –