具有嵌套结构数组的PInvoke传递结构C#

时间:2012-08-28 22:56:06

标签: c# c++ pinvoke marshalling

我在C#中有一个需要传递给C ++ DLL的结构。

typedef struct
{
    TDate  fDate;
    double fRate;
} TRatePt;

typedef struct _TCurve2
{
    int       fNumItems;     /* Number of TRatePts in fArray */
    TRatePt  *fArray;        
    TDate     fBaseDate;     
} TCurve2;

以下是我在C#中创建的结构。

[StructLayout(LayoutKind.Sequential), Serializable]
public struct TRatePt
{
    public int fDate;
    public double fRate;
}

[StructLayout(LayoutKind.Sequential), Serializable]
public struct TCurve2
{
    public int fNumItems;
    public IntPtr fArray;
    public int fBaseDate;
}

我在C DLL中有一个简单的方法。

EXPORT int TestMethodForZC(TCurve2 *discCurve)
{
    printf("\n\nIn TestMethodForZC\n");
    printf("discCurve->fBaseDate = %d\n\n\n",discCurve->fBaseDate );
    return 0;
}

我正在使用PInvoke使用以下方法调用它:

[DllImport("clibrary.dll", EntryPoint = "TestMethodForZC", , CallingConvention = CallingConvention.Cdecl)]
private static extern int _TestMethodForZC(ref TCurve2 discCurve);

TRatePt的Marshaling:

 TRatePt[] items = new TRatePt[2];
 items[0].fDate = 200;
 items[1].fDate = 300;

 items[0].fRate = 0.2d;
 items[1].fRate = 0.3d;
 TCurve2 tc2 = new TCurve2() { fBaseDate = 12000, fNumItems = 2 };

 tc2.fNumItems = items.Length;
 tc2.fArray = Marshal.AllocHGlobal(items.Length * Marshal.SizeOf(typeof(TRatePt)));

 IntPtr item = tc2.fArray;
 for (int i = 0; i < items.Length; i++)
 {
     Marshal.StructureToPtr(items[i], item, false);
     item = new IntPtr(item.ToInt32() + Marshal.SizeOf(typeof(TRatePt)));
     }

 _TestMethodForZC(ref tc2);

我正在手动编组TRatePt并将IntPtr传递给方法,但它正在打印垃圾值。我在Marshaling上尝试过Int32和Int64,但没有任何区别。难道我做错了什么?有什么建议吗?

PS:我试过在stackoverflow中查找这个问题,我找到了一个有很多讨论的问题,但没有一个建议对我有用。

0 个答案:

没有答案