是否有一种简单的方法来编组包含从非托管到托管的指针数组的数据结构

时间:2014-12-18 17:12:17

标签: c# arrays pointers struct marshalling

好的,我一直试图编组一个具有C / C ++格式的等效数据结构:

Struct ResultsRecord
{

        int LengthOutMD; // this contains the size for the arrays below.


    float *OutMD;

    float *OutAxialLoad;
    float *OutNormalForce
}

这是dll文件中非托管代码中包含的函数:

typedef int (cdecl *ReadResultsTnDAnalysis) (wchar_t* ResultFileName, struct ResultsRecord* TnDResultsRecord);

现在这里是我的解决方案,暂时不起作用:因为我找不到一种简单的方法来编组指向数组初始值的指针:数组的大小是先验未知的。

public class APIforEngine
  {
        [DllImport("TnDAnalysisDLL.dll", EntryPoint = "ReadResultsTnDAnalysis", CallingConvention = CallingConvention.Cdecl  
        public static extern int ReadResultsTnDAnalysis(string resultFileName,
        ref TnDResultsRecord tnDResultsRecord);, CharSet = CharSet.Auto)]

  }

[StructLayout(LayoutKind.Sequential), Serializable]
public struct TnDResultsRecord
{

    public int LengthOutMD;


    [MarshalAs(UnmanagedType.LPArray)]
    public float[] OutMD;
    [MarshalAs(UnmanagedType.LPArray)]
    public float[] OutAxialLoad;
    [MarshalAs(UnmanagedType.LPArray)]
    public float[] OutNormalForce;
 }

非常感谢您的帮助。

现在我正考虑在中间C ++项目中使用dll,将数据转换为C#易于读取的内容,并在我的C#解决方案中使用它。即使是这条路线,我也要看看它是否真的可行,因为我不知道如何消费它。在本机c ++中还是使用CLR?如果我使用CLR,我是否使用InterOpServices命名空间类或使用头文件来使用它。

0 个答案:

没有答案