Я занимаюсь разработкой библиотеки 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");
приложение работает нормально.
Я надеюсь, что кто-нибудь может мне помочь.
Спасибо
РЕДАКТИРОВАТЬ:
[DllImport] уже закрепляет параметры; и нет необходимости в небезопасном коде
Спасибо @dan
В любом случае, это можно исправить, выполнив memset(item->tagValue, '\0', 256*sizeof(char));
Других решений пока нет …