0

我在 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 的编组:

 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中查找这个问题,我发现一个有很多讨论的问题,但没有一个建议对我有用。

4

0 回答 0