我将一个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_text
从wstring
转换为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)
1条答案
按热度按时间uttx8gqw1#
使用P/Invoke有两个(简单的)字符串封送处理选项:
[CharSet = CharSet.Ansi]
,要么在C中使用char*
。这要求C库使用“ANSI”字符集,但这里似乎不是这种情况。[CharSet = CharSet.Unicode]
并在C#中具有wchar_t*
对于第二个选项,最后的语句应为:
重要警告:strcpy/wcscpy是危险的,因为它可能会覆盖您没有分配的内存。我强烈建议将其替换为:
size
是缓冲区大小(最大字符数,包括终止NUL),必须作为附加参数传递给该方法。