分享

如何在C中构建动态数组并将其返回给C#/ .NET

 印度阿三17 2019-10-08

我必须找到在C Win32端构建结构数组的方法.我没有最初的项目数.调整该数组的速度应该非常快.

构建列表时,我需要将其返回给.NET.因此,数组(列表)应该转换为可以在.NET端轻松读取的传输,或者初始列表可以“按原样”使用,只需传递指针即可.

在此先感谢给我一个提示!

解决方法:

在C中实现“动态数组”的一种非常常见的方法是使用STL的std :: vector.在您的情况下,您可以定义向量< SomeData>.根据您的请求,std :: vector可以动态地(即在运行时)更改其大小:您可以使用其push_back或emplace_back方法来实现此目的,向向量添加新项.

但是,C#并不“理解”std :: vector.

要将其内容编组到C#,您可以使用SAFEARRAY,CLR非常清楚. SAFEARRAY的好处在于它除了数组内容之外还存储数组大小:它是一个独立的数据结构.
因此,您可以创建适当大小的SAFEARRAY,用向量中动态创建的内容填充它,并将该SAFEARRAY传递给C#.

请注意,您也可以直接构建SAFEARRAY,而不传递std :: vector.但STL的矢量具有更强大的编程接口;所以如果你想在运行时通过push_back或emplace_back做几个项目的添加,首先构建std :: vector,然后将它“编组”到SAFEARRAY,可能是更好的选择.无论如何,这取决于您的特定需求和背景.

作为替代方案,您可以使用C/C LI作为C端和C#端之间的桥接层.在这种情况下,您可以使用gcnew来创建.NET“托管”数组.

而且,作为另一种选择,您可以使用C接口从本机C DLL导出一些函数:

>一个获取数组中项目数的函数
>另一个函数,用于在输出调用者分配的缓冲区中获取实际的数组数据(其大小由前一个函数返回)

在C#中,使用IntPtr输出参数传递输出缓冲区指针.
然后,您可以使用Marshal.PtrToStructure来编组单个数据项,并且可以使用Marshal.SizeOf增加指针,使其指向数组中的下一个项目.

像这样的东西:

// In C  :

struct SomeData
{
    /* your data fields */
};

// Export these two functions from your native DLL:
extern "C" int GetSomeDataCount( /* some params */ );
extern "C" void GetSomeData( SomeData* ptr, /* some other params */ );


// In C#:    

public struct SomeData
{
    // Map C   data structure fields to C#
}

static extern int GetSomeDataCount( /* some params */ );
static extern void GetSomeData( [Out] out IntPtr ptr, /* some other params */ );

SomeData[] GetSomeData( /* some params */ )
{
    // Allocate an array of proper size
    SomeData[] dataArray = new SomeData[ GetSomeDataCount( /* some params */ ) ];

    // Fill the array with content from GetSomeData
    IntPtr dataPtr;
    GetSomeData( out dataPtr, /* some other params */ );
    for (int i = 0; i < dataArray.Length; i  )
    {
        dataArray[i] = Marshal.PtrToStructure(dataPtr, typeof(SomeData));
        dataPtr  = Marshal.SizeOf(typeof(SomeData));
    }
    return dataArray;
}
来源:https://www./content-1-495001.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多