[通过共享内存将c ++ char *传递给c#

问题描述 投票:1回答:1

很抱歉,可能是一个简单的问题,但我是共享内存中的新手,并试图通过示例学习如何做事。

在c ++方面,我收到这样的对:const unsigned char * value, size_t length在C#端,我需要有常规的C#字符串。使用共享内存的最佳方法是什么?

c# c++ shared-memory
1个回答
0
投票

使用字符串不是那么容易。

如果是我,我将尝试以下方式:

1。只需获取字符串的副本。 System.Text.Encoding.Default.GetString可能从字节数组转换为字符串。

您可以尝试使用不安全的代码块(为此您可以使用指针类型):

((1)创建一个字节数组,大小是您的“长度”]

byte [] buf =新的byte [length];

((2)将您的数据复制到数组中

for(int i = 0; i

((3)获取字符串

string what_you_want = System.Text.Encoding.Default.GetString(buf);

2。编写一个具有属性“字符串what_you_want”的类,并且每次访问它时,都会执行上述过程。

首先,您应该首先使用P / Invoke功能来获取该对的值。

编辑:这是一个例子。

C ++代码:

struct Pair {
    int length;
    unsigned char value[1024];
};

#include <windows.h>
#include <stdio.h>
int main()
{
    const char* s = "hahaha";
    HANDLE handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"MySharedMemory");
    struct Pair* p = (struct Pair*) MapViewOfFile(handle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(Pair));
    if (p != 0) {
        p->length = lstrlenA(s);
        lstrcpyA((char*)p->value, s);
        puts("plz start c# program");
        getchar();
    } else
        puts("create shared memory error");
    if (handle != NULL)
        CloseHandle(handle);
    return 0;
}

和C#代码:使用系统;使用System.IO.MemoryMappedFiles;

class Program
{
    static void Main(string[] args)
    {
        MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("MySharedMemory");
        MemoryMappedViewStream mmfvs = mmf.CreateViewStream();
        byte[] blen = new byte[4];
        mmfvs.Read(blen, 0, 4);
        int len = blen[0] + blen[1] * 256 + blen[2] * 65536 + blen[3] * 16777216;
        byte[] strbuf = new byte[len];
        mmfvs.Read(strbuf, 0, len);
        string s = System.Text.Encoding.Default.GetString(strbuf);
        Console.WriteLine(s);
    }
}

例如。

您还可以添加错误检查部分。

© www.soinside.com 2019 - 2024. All rights reserved.