おそらく単純な質問で申し訳ありませんが、私は共有メモリの初心者であり、例から物事を行う方法を学ぼうとしています。
C++ 側では、次のようなペアを受け取りますconst unsigned char * value, size_t length
。C# 側では、通常の C# 文字列が必要です。共有メモリを使用する最善の方法は何ですか?
おそらく単純な質問で申し訳ありませんが、私は共有メモリの初心者であり、例から物事を行う方法を学ぼうとしています。
C++ 側では、次のようなペアを受け取りますconst unsigned char * value, size_t length
。C# 側では、通常の C# 文字列が必要です。共有メモリを使用する最善の方法は何ですか?
文字列を使用するのはそれほど簡単ではありません。
私なら、次の方法を試します。
1.単に文字列のコピーを取得します。System.Text.Encoding.Default.GetString は、バイト配列から文字列に変換される場合があります。
安全でないコード ブロック (ポインター型を使用できるため) で次のことを試すことができます。
(1)バイト配列を作成します。サイズは「長さ」です
バイト[] buf = 新しいバイト[長さ];
(2)データを配列にコピーします
for(int i = 0; i < 長さ; ++i) buf[i] = 値[i];
(3) 文字列を取得する
文字列 what_you_want = 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;
}
および C# コード: System を使用。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);
}
}
たとえば。
エラーチェック部分を追加することもできます。