如何使用共享内存将int[]从c#传递到c++

本文关键字:c++ 共享 何使用 内存 int | 更新日期: 2023-09-27 18:21:23

我正试图通过托管内存文件将一个整数数组从c#传递到c++。文本很容易处理,但我在c++环境中已经超出了我的深度,不知道如何针对整数数组调整它。

在c端,我通过:

pView = LS.Core.Platforms.Windows.Win32.MapViewOfFile(
                hMapFile,                       // Handle of the map object
                LS.Core.Platforms.Windows.Win32.FileMapAccess.FILE_MAP_ALL_ACCESS, // Read and write access
                0,                              // High-order DWORD of file offset 
                ViewOffset,                     // Low-order DWORD of file offset
                ViewSize                        // Byte# to map to the view
                );
byte[] bMessage2 = Encoding.Unicode.GetBytes(Message2 + ''0');
Marshal.Copy(bMessage2, 0, pView2, bMessage2.Length);

这里pView2是指向内存映射文件的指针。

在c++方面,我调用:

LPCWSTR pBuf;
pBuf = (LPCWSTR) MapViewOfFile(hMapFile, // handle to map object
           FILE_MAP_ALL_ACCESS,  // read/write permission
           0,
           0,
           BUF_SIZE);

我该如何将其更改为处理整数数组?谢谢

如何使用共享内存将int[]从c#传递到c++

a)您可以将int[]复制到byte[]中。您可以使用BitConverter.GetBytes或位算术(byte0=(字节)(i>>24);byte1=(字节)(i>>16);…)

b) 您可以使用不安全的代码将int[]位复制(blit)到目标字节[]

c) 也许你可以使用Array.Copy。我认为它可以处理任何blitable值类型。

根据评论,我将详细说明b):

int[] src = ...;
IntPtr target = ...;
var bytesToCopy = ...;
fixed(int* intPtr = src) {
 var srcPtr = (byte*)intPtr;
 var targetPtr = (byte*)target;
 for(int i from 0 to bytesToCopy) {
  targetPtr[i] = srcPtr[i];
 }
}