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.Zero
和null
.
当我调用 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 string
和 StringBuilder
有什么区别?另外,我可以在不访问 C 库内部的情况下对其进行调试吗?
您的问题已在此处得到解答 -
DLLImport c++ 函数与 char* 输入和输出参数
我不会在这里重复信息 - 请阅读上面的链接,这将解释调用函数的过程。
我觉得解释StringBuilder和String之间的区别不会帮助你解决你的问题。