使用 StringBuilder 的不安全代码和固定语句
我想知道如何将 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有关如何封送字符串和 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.