C#将char*封送至StringBuilder,得到的字符串总是空的

C# marshalling char* to StringBuilder get always empty string

本文关键字:字符串 StringBuilder char      更新时间:2023-10-16

我正在开发一个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, '', 256*sizeof(char)); 来修复