一些数据的副本不属于堆(没有特殊处理)。例如,堆栈上的JavaScriptValue结构在与 Chakra JavaScript 引擎的互操作方面做得很好。
但据我了解,将这样的值存储在托管堆上(没有正确的引用计数)会导致可能的悬空引用。有没有办法将这样的 ac# 结构声明为不可装箱?
澄清,如果在类型上生成任何装箱操作,我希望 c# 编译器生成错误消息。
参考:请参阅MSDN JSAddRef 参考,其中说:
这只需要在不会存储在堆栈中某处的 JsRef 句柄上调用。调用 JsAddRef 确保 JsRef 所引用的对象在调用 JsRelease 之前不会被释放。
我从中得知,Chakra 可能正在使用“保守的垃圾收集”方法,使得基于堆栈的 JsRef 句柄不需要 JsAddRef/JsRelease。 我想使用一个类(而不是结构)来包装堆上的 JsRef 句柄,并有一个转换操作来调用 JsAddRef,并使用 IDisposable 模式来调用 JsRelease。