1

我已经成功地将 firefox/xulrunner 嵌入到我们的 c# 应用程序中,但它并非没有问题。偶尔会抛出一个 AccessViolationException,我认为这是由 GC 在内存中移动托管对象和非托管 xpcom 在移动后尝试使用它引起的。例如,我为自定义协议创建了一个协议处理程序,该协议实现了一些 firefox/xulrunner 调用的接口。在这样做之后,AccessViolationException 变得更加占主导地位。我将 GCHandle.Alloc(object, GCHandleType.Pinned) 作为一种可能的解决方案进行了研究,但找不到足够的信息来说明如何编写自定义编组器以使我的类实现了“blittable”接口。那么有没有人对如何处理这个问题或如何将我的课程翻译成“blittable”课程有任何想法?此外,几乎不可能追踪互操作的哪些部分导致了 AccessViolationException。呃:-(

感谢您的任何见解!

4

1 回答 1

2

我相信我可以通过我问的另一个问题“GetComInterfaceForObject 是否固定对象?”来回答这个问题。. 基本上我相信的是 AccessViolationExceptions 是由 .net 端超出范围的对象生成的,如果我的理解是正确的,则非托管引用将不会使托管对象保持活动状态。因此,我创建的任何托管对象都需要存在很长一段时间,以便非托管代码可以调用它,现在存储在字段或列表中。同样在“blittable”对象方面,我还没有找到固定类的方法,但我确实设法弄清楚如何固定实现接口的结构。该接口是一个定义了 MarshalAs 属性的互操作接口,它允许转换为非托管代码,因此显然允许固定对象。

:-)

于 2009-06-30T21:36:17.390 回答