Чтение файла, сопоставленного с памятью C++ и C#C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Чтение файла, сопоставленного с памятью C++ и C#

Сообщение Anonymous »

Я пытаюсь поделиться структурой из C++ в C#, используя файл с отображением в памяти. На данный момент мне удалось записать файл, но я не могу прочитать его содержимое на C#.
  • Отправить данные на C++

Код: Выделить всё

struct Bus_1553 // this is the structure to send
{
string name;
int directions;
};

struct Bus_1553* p_1553; // set the pointer to it
HANDLE handle; // create the handle

// here we define the data to send
string name = "IFF";
int directions = 3;

bool startShare() // Open the shared memory
{
try
{
handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Bus_1553), L"DataSend");
p_1553 = (struct Bus_1553*) MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, sizeof(Bus_1553));
return true;
}
catch (...)
{
return false;
}

}

int main()
{

if (startShare() == true)
{

while (true)
{
if (p_1553 != 0) // populate the memory
{

p_1553->name = name;
p_1553->directions = directions;
}

else
puts("create shared memory error");
}
}
if (handle != NULL)
CloseHandle(handle);
return 0;
}
  • Пытаюсь читать на C#

Код: Выделить всё

namespace sharedMemoryGET
{
class sharedMemoryGET
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct Bus_Data_1553
{
public string name;
public int directions; // which directions used
}

public static MemoryMappedFile mmf;
public static MemoryMappedViewStream mmfvs;

static public bool MemOpen() // open the mapped file
{
try
{
mmf = MemoryMappedFile.OpenExisting("DataSend");
return true;
}
catch
{
return false;
}

}

public static void readData()
{
if (MemOpen())
{
using (var accessor = mmf.CreateViewAccessor())
{
accessor.Read(0, out Bus_Data_1553 a);
Console.WriteLine(a.name);
Console.WriteLine(a.directions);
}
}

}
}
}
Когда в структуре для совместного использования присутствует строка, возникает следующая ошибка:
Указанный тип должен быть структурой, не содержащей ссылок.
Когда я удаляю строку и предоставляю только целочисленные направления, я получаю значение 0. Может кто-нибудь помочь мне разобраться в этом?

Подробнее здесь: https://stackoverflow.com/questions/629 ... nd-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»