我必須找到在C Win32端構(gòu)建結(jié)構(gòu)數(shù)組的方法.我沒有最初的項目數(shù).調(diào)整該數(shù)組的速度應(yīng)該非???
構(gòu)建列表時,我需要將其返回給.NET.因此,數(shù)組(列表)應(yīng)該轉(zhuǎn)換為可以在.NET端輕松讀取的傳輸,或者初始列表可以“按原樣”使用,只需傳遞指針即可.
在此先感謝給我一個提示! 解決方法: 在C中實現(xiàn)“動態(tài)數(shù)組”的一種非常常見的方法是使用STL的std :: vector.在您的情況下,您可以定義向量< SomeData>.根據(jù)您的請求,std :: vector可以動態(tài)地(即在運行時)更改其大小:您可以使用其push_back或emplace_back方法來實現(xiàn)此目的,向向量添加新項.
但是,C#并不“理解”std :: vector.
要將其內(nèi)容編組到C#,您可以使用SAFEARRAY,CLR非常清楚. SAFEARRAY的好處在于它除了數(shù)組內(nèi)容之外還存儲數(shù)組大?。核且粋€獨立的數(shù)據(jù)結(jié)構(gòu). 因此,您可以創(chuàng)建適當大小的SAFEARRAY,用向量中動態(tài)創(chuàng)建的內(nèi)容填充它,并將該SAFEARRAY傳遞給C#.
請注意,您也可以直接構(gòu)建SAFEARRAY,而不傳遞std :: vector.但STL的矢量具有更強大的編程接口;所以如果你想在運行時通過push_back或emplace_back做幾個項目的添加,首先構(gòu)建std :: vector,然后將它“編組”到SAFEARRAY,可能是更好的選擇.無論如何,這取決于您的特定需求和背景.
作為替代方案,您可以使用C/C LI作為C端和C#端之間的橋接層.在這種情況下,您可以使用gcnew來創(chuàng)建.NET“托管”數(shù)組.
而且,作為另一種選擇,您可以使用C接口從本機C DLL導(dǎo)出一些函數(shù):
>一個獲取數(shù)組中項目數(shù)的函數(shù) >另一個函數(shù),用于在輸出調(diào)用者分配的緩沖區(qū)中獲取實際的數(shù)組數(shù)據(jù)(其大小由前一個函數(shù)返回)
在C#中,使用IntPtr輸出參數(shù)傳遞輸出緩沖區(qū)指針. 然后,您可以使用Marshal.PtrToStructure來編組單個數(shù)據(jù)項,并且可以使用Marshal.SizeOf增加指針,使其指向數(shù)組中的下一個項目.
像這樣的東西:
// 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
|