整理结构列表时出现意外结果

时间:2019-01-12 19:00:14

标签: c# c++ interop marshalling

我找不到我做错了什么。我想我正在按照数字进行所有操作,但似乎我缺少了一些东西。

在托管方面:

public override List<TimerPair> GetNativeTimers()
{
    var listPtr = HgrDll.GetNativeTimers(out var size, out var ptrShift);

    if (listPtr == IntPtr.Zero)
        throw new NullReferenceException("sounds like the list"
             + " pointer was not given");

    var timerPairList = new List<TimerPair>(size);
    var structSize = Marshal.SizeOf(typeof(TimerPairStruct2));

    for (var i = 0; i < size; i++)
    {
        var o = Marshal.PtrToStructure<TimerPairStruct2>(listPtr).ToTimerPair();
        timerPairList.Add(o);
        listPtr += structSize;
    }
    return timerPairList;
}

目标结构(用于中间计算)和类:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct TimerPairStruct2 : ITimerPairStruct
{
    public long Time;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
    public string Descr;

    public TimerPair ToTimerPair() => new TimerPair(Descr, Time);
}

public class TimerPair
{
    public string Descr { get; set; }
    public TimeSpan Time { get; set; }
    public TimerPair(string descr, long time)
    {
        Descr = descr;
        Time = new TimeSpan(0,0,0,0, (int)((double)time/1000000));
    }
}

对于Pinvoke部分:

[DllImport("DwarfHomograph.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr GetNativeTimers(out int size, out int ptrShift);

,现在在本地:

DwarfHgr* DwarfAsset = nullptr;

extern "C" __declspec(dllexport) list<TimerPair>* GetNativeTimers(
    int* size,
    int* ptrShift)
{
    return DwarfAsset->GetNativeTimers(size, ptrShift);
}

DwarfHgr类中使用的方法:

list<TimerPair>* DwarfHgr::GetNativeTimers(int* size, int* ptrShift)
{
    TimerPairsList = Sw.AsTimerPairs();
    *size = static_cast<int>(TimerPairsList.size());
    *ptrShift = sizeof(TimerPair);
    return &TimerPairsList;
}

,成员为list<TimerPair> TimerPairsList;

我正在编组的结构是:

//#pragma pack(push,8)
struct __declspec(dllexport) TimerPair final
{
    long long Time{}; // ns
    char Descr[64]{};
};
//#pragma pack(pop)

我在本机端和受管端都进行单元测试; 预期结果看起来像(本机):

ImageA processing: 22.0704ms
ImageB processing: 22.0448ms
MatFullA.copyTo: 1.87452ms
MatToSparse: 1.93482ms
calcOpticalFlowFarneback: 1115.48ms
create flowSparse image: 10.1416ms

但是我有这个(托管):

°óŠqÉ: 1,964,675.000000ms
q$Fý: 140,725,780.000000ms
xr$Fý: 140,725,780.000000ms
: 549,755.000000ms
à¡CUÉ: 1,964,675.000000ms
: 0.000000ms

0 个答案:

没有答案