out string 和 StringBuilder for .net/native marsrangeing 有什么区

本文关键字:native marsrangeing 什么区 net string StringBuilder for out | 更新日期: 2023-09-27 17:56:57

我有一个C库,我没有需要从.NET调用的源代码。

我需要的Query函数的签名是:

typedef int LoginID;
typedef const char* XML;
typedef DSQUERYHANDLER* PDSQUERYHANDLER;
typedef ErrCode DSQUERYHANDLER (LoginID lh, void* tag, XML resXML, ErrCode retCode);
Query(LoginID lh, XML queryXML, XML* queryResultXML_out, void* tag, PDSQUERYHANDLER cb);

我为此编写的 C# 是:

delegate ErrCode DSQUERYHANDLER(int lh, IntPtr tag, string resXML, ErrCode retCode);
[DllImport("dllname.dll")]
internal static extern ErrCode Query(int lh, string queryXML, out string queryResultXML_out, IntPtr tag, DSQUERYHANDLER cb);

我实际上并不关心最后两个参数并传递IntPtr.Zeronull.

当我调用 Query 时,它会用我期望的值设置我给它的字符串,但它也会崩溃并显示 System.AccessViolationException!

如果我改为使用 StringBuilder 而不是 out string

[DllImport("dllname.dll")]
internal static extern ErrCode Query(int lh, string queryXML, StringBuilder queryResultXML_out, IntPtr tag, DSQUERYHANDLER cb);

然后它不会崩溃,但StringBuilder包含 4 的长度,但每次运行时的值都不同,例如 Èf 或 p'F。

我的问题

使用 out stringStringBuilder 有什么区别?另外,我可以在不访问 C 库内部的情况下对其进行调试吗?

out string 和 StringBuilder for .net/native marsrangeing 有什么区

您的问题已在此处得到解答 -

DLLImport c++ 函数与 char* 输入和输出参数

我不会在这里重复信息 - 请阅读上面的链接,这将解释调用函数的过程。

我觉得解释StringBuilder和String之间的区别不会帮助你解决你的问题。