C # маршалинг char * в StringBuilder получить всегда пустую строку

Я занимаюсь разработкой библиотеки C ++ и приложения C #, которое должно ее использовать.
Библиотека принимает два числовых входных аргумента и один строковый выходной параметр.
Моя проблема в том, что в приложении C # я всегда получаю пустую строку для этого параметра. Вот мой код


Сторона C ++:

    typedef struct sharedItem{
unsigned int tagId;
unsigned char tagValue[256];
}sharedItem;extern "C" {
int getSharedMemoryVariable(char* value, unsigned int variableTagId, int foundVariables)
{
sharedItem *item;

set item properly...

strcpy(value, (char *)item->tagValue);

check result and return properly...
}

}


Сторона C #

    [DllImport("C:\\SharedMemory.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
public static extern int getSharedMemoryVariable(StringBuilder variableValue, UInt16 variableTagId, Int16 foundVariables);

StringBuilder value = new StringBuilder(256);
res = SharedMemory.getSharedMemoryVariable(value, 45, 14730);

Моя проблема в том, что значение переменной всегда пустая строка. Обратите внимание, что на стороне C ++, если я заменю

strcpy(value, (char *)item->tagValue);

с

strcpy(value, "test");

приложение работает нормально.
Я надеюсь, что кто-нибудь может мне помочь.
Спасибо

0

Решение

РЕДАКТИРОВАТЬ:

[DllImport] уже закрепляет параметры; и нет необходимости в небезопасном коде

Спасибо @dan

В любом случае, это можно исправить, выполнив memset(item->tagValue, '\0', 256*sizeof(char));

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]