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

Posted

技术标签:

【中文标题】C# 将 char* 编组到 StringBuilder 总是得到空字符串【英文标题】:C# marshalling char* to StringBuilder get always empty string 【发布时间】:2015-11-04 16:11:22 【问题描述】:

我正在开发一个 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");

应用程序运行良好。 我希望有人能帮助我。 谢谢

【问题讨论】:

您是否尝试使用string 而不是StringBuilder 您可以尝试使用[Out, MarshalAs(UnmanagedType.LPStr)]StringBuilder variableValue。它准确地告诉运行时要做什么。不确定它是否有帮助,但它也不会伤害。 【参考方案1】:

编辑:

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

谢谢@丹

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

【讨论】:

@Dan 你能指出一个可以验证这一点的参考吗? manski.net/2012/06/pinvoke-tutorial-pinning-part-4 暗示我是正确的,事实上 DllImport 实际上并没有固定参数。

以上是关于C# 将 char* 编组到 StringBuilder 总是得到空字符串的主要内容,如果未能解决你的问题,请参考以下文章

将字符串从 c# 编组到 c++

如何在 C# 中编组数据类型 unsigned char**?

C# 中的字符 * 编组

在 C# 中使用“const char*”和“const int”编组我的 C++ .dll

C# 中的元帅“char *”

将复杂结构编组到 C#