使用 StringBuilder 的不安全代码和固定语句

发布于 2024-08-13 22:34:53 字数 333 浏览 11 评论 0原文

我想知道如何将 String 或 StringBuilder 传递给通过参数输出字符串的 C 函数。 中找到了一个很好的答案

我在从 C# 调用非托管函数:我应该传递 StringBuilder 还是使用不安全代码?

但我有疑问。任何人都可以向我解释为什么垃圾收集器在导入函数执行期间不重新定位(托管)StringBuilder 实例?

I was wondering about how passing a String or a StringBuilder to a C function which output a string by parameter. I've found a great answer in

Calling unmanaged function from C#: should I pass StringBuilder or use unsafe code?

But I have a doubt. Anyone can explain to me why the garbage collector doesn't relocate the (managed) StringBuilder instance during imported function execution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫七 2024-08-20 22:34:53

有关如何封送字符串和 StringBuilder 的详细信息,请参阅字符串的默认封送处理使用 COM 和 P/Invoke 时。它没有明确说明为什么使用模式是安全的,但确实表明使用字符串和 StringBuilder 进行 P/Invoke 是受支持和预期的行为。我怀疑编组系统负责在外部调用期间固定缓冲区,从而防止 GC 重新定位它。

See Default Marshaling for Strings for details on how string and StringBuilder is marshaled when using COM and P/Invoke. It doesn't explicitly say why the usage pattern is safe, but does indicate that using string and StringBuilder for P/Invoke is supported and intended behaviour. I suspect that the marshalling system takes care of pinning the buffer for the duration of the external call, preventing the GC from relocating it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文