C#编组char *到StringBuilder总是得到空字符串

时间:2015-11-04 16:11:22

标签: c# c++ marshalling 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#side

    [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");

应用程序正常。 我希望有人可以帮助我。 谢谢

1 个答案:

答案 0 :(得分:-1)

编辑:

  

[DllImport]已经引脚参数;并且不需要不安全的代码

谢谢@dan

无论如何,可以通过memset(item->tagValue, '\0', 256*sizeof(char));

来修复