从c dll导出后,c#中的字符串输出出现问题

omqzjyyz  于 2022-12-03  发布在  C#
关注(0)|答案(1)|浏览(187)

我将一个dll连接到我的c#代码,以便从中返回一个字符串:
第一个
连接到C#:

[DllImport("dll_name.dll", CharSet = CharSet.Unicode)]
        public static extern void realize(StringBuilder text);

然后我使用这个函数并将结果字符串放入textBox中:

StringBuilder text = new StringBuilder(100);
            realize(text);
            textBox4.Text = text.ToString();

But instead of text: РАЗВОРОТ(1, 1.1, 1.2, 1.3, 1.4) РАЗВОРОТ(1, 2.1, 2.2, 2.3, 2.4) the textBox outputs this: РАЗВОРОТ(듹翼
“full_text”变量被正确填充,但我不确定“fill”变量,可能问题出在strcpy或dll导出中。我使用StringBuilder来处理这个问题的建议:Passing strings from C# to C++ DLL and back -- minimal example

编辑我部分解决了这个问题,现在整个文本都显示在textBox中(而不是像以前那样只显示一部分)。我刚刚将full_textwstring转换为string,以便在strcpy中使用。我还将CharSet.Unicode更改为CharSet.Ansi。但是,文本现在是这样的:(1,1.1,1.2,1.3,1.4)(1,2.1,2.2,2.3,2.4)(1,1.1,1.2,1.3,1.4)(1,2.1,2.2,2.3,2.4)

uttx8gqw

uttx8gqw1#

使用P/Invoke有两个(简单的)字符串封送处理选项:

  • 要么在C#中声明[CharSet = CharSet.Ansi],要么在C中使用char*。这要求C库使用“ANSI”字符集,但这里似乎不是这种情况。
  • 或者在C#中声明[CharSet = CharSet.Unicode]并在C#中具有wchar_t*

对于第二个选项,最后的语句应为:

wchar_t* fill = full_text.c_str();
wcscpy(buf, fill);

重要警告:strcpy/wcscpy是危险的,因为它可能会覆盖您没有分配的内存。我强烈建议将其替换为:

wcscpy_s(buf, size, fill);

size是缓冲区大小(最大字符数,包括终止NUL),必须作为附加参数传递给该方法。

相关问题