乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       印度阿三17 2019-10-08

      我必須找到在C Win32端構建結構數組的方法.我沒有最初的項目數.調整該數組的速度應該非???

      構建列表時,我需要將其返回給.NET.因此,數組(列表)應該轉換為可以在.NET端輕松讀取的傳輸,或者初始列表可以“按原樣”使用,只需傳遞指針即可.

      在此先感謝給我一個提示!

      解決方法:

      在C中實現“動態(tài)數組”的一種非常常見的方法是使用STL的std :: vector.在您的情況下,您可以定義向量< SomeData>.根據您的請求,std :: vector可以動態(tài)地(即在運行時)更改其大?。耗梢允褂闷鋚ush_back或emplace_back方法來實現此目的,向向量添加新項.

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

      要將其內容編組到C#,您可以使用SAFEARRAY,CLR非常清楚. SAFEARRAY的好處在于它除了數組內容之外還存儲數組大小:它是一個獨立的數據結構.
      因此,您可以創(chuàng)建適當大小的SAFEARRAY,用向量中動態(tài)創(chuàng)建的內容填充它,并將該SAFEARRAY傳遞給C#.

      請注意,您也可以直接構建SAFEARRAY,而不傳遞std :: vector.但STL的矢量具有更強大的編程接口;所以如果你想在運行時通過push_back或emplace_back做幾個項目的添加,首先構建std :: vector,然后將它“編組”到SAFEARRAY,可能是更好的選擇.無論如何,這取決于您的特定需求和背景.

      作為替代方案,您可以使用C/C LI作為C端和C#端之間的橋接層.在這種情況下,您可以使用gcnew來創(chuàng)建.NET“托管”數組.

      而且,作為另一種選擇,您可以使用C接口從本機C DLL導出一些函數:

      >一個獲取數組中項目數的函數
      >另一個函數,用于在輸出調用者分配的緩沖區(qū)中獲取實際的數組數據(其大小由前一個函數返回)

      在C#中,使用IntPtr輸出參數傳遞輸出緩沖區(qū)指針.
      然后,您可以使用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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多