我必须找到在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
|