日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何在C中構(gòu)建動態(tài)數(shù)組并將其返回給C#/ .NET

 印度阿三17 2019-10-08

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多