通过c&x2B+;通过共享内存将字符*转换为c#

通过c&x2B+;通过共享内存将字符*转换为c#,c#,c++,shared-memory,C#,C++,Shared Memory,对不起,这个问题可能很简单,但我是共享内存的新手,试图通过示例学习如何做事 在C++方面,我收到这样的对: const unChar char值,sisitht长度< /> 在c端,我需要有规则的c字符串。使用共享内存最好的方法是什么?使用字符串并不是那么容易 如果是我,我会尝试以下方法: 1.只需获取字符串的副本。System.Text.Encoding.Default.GetString可以从字节数组转换为字符串 您可以尝试在不安全的代码块中(为此,您可以使用指针类型)执行以下操作: (1)

对不起,这个问题可能很简单,但我是共享内存的新手,试图通过示例学习如何做事

在C++方面,我收到这样的对:<代码> const unChar char值,sisitht长度< />
在c端,我需要有规则的c字符串。使用共享内存最好的方法是什么?

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

如果是我,我会尝试以下方法:

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

您可以尝试在不安全的代码块中(为此,您可以使用指针类型)执行以下操作:

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

字节[]buf=新字节[长度]

(2) 将数据复制到阵列

对于(inti=0;i (3) 获取字符串

string what_you_所需=System.Text.Encoding.Default.GetString(buf)

2.编写一个类,拥有一个属性“string 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;
}
举个例子


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

很抱歉,我不明白您的建议,可能有些代码可能会有帮助:)此外,我根本不想使用
p/Invoke
,因为它相对较慢,而且我正在编写低延迟代码。@javapowered.net中似乎没有内置共享内存功能。References@javapowered我从来不知道.net现在有内置共享内存支持。现在我的答案中增加了一个例子。您可以看看它。@javapowered,因为指针表示当前进程的地址。当涉及到进程间通信时,进程a的指针可能不适用于进程B。因此,在本例中,我在结构中使用就地数组。对不起,英语不好
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);
    }
}