2009-10-20 91 views
2

我正在阅读.net 3.5中应用程序域的文档,并遇到了SandboxInterop。文档说什么是AppDomainSetup.SandboxInterop属性?

获取或设置一个值,该值指示是否禁用应用程序域中互操作调用的接口缓存,以便每次调用都执行QueryInterface。

但是为什么我会不想禁用QueryInterface的缓存?

(快速谷歌未发现任何解释的方式?)

回答

2

在典型操作中,通常有什么理由要担心的QueryInterface调用被缓存。

但是,其他方可能会创建其中未完成接口的数量与组件操作绑定的组件。此外,还有一些异常值,从COM对象接收到的接口有一个实现,可能会使控制对象的生命周期变得更加困难。

例如,用ATL编写的组件可以使用tearoff接口创建。这些撕裂在主对象的二进制布局中不可用,并且通常在与其父对象协调的另一隐藏对象上实现。由于成功的QueryInterface调用会隐式计算为AddRef调用,因此如果缓存接口引用,则tearoff提供程序的生命周期可能会超出其预期版本。另外,也可能存在一种情况,即对象只提供特定界面的一次撕下,意图是通过该界面一次只有一个用户。如果两个使用者在第二个请求的意图失败时发出相同的副本,则缓存副本可能会违反该行为。

最后,更可能出现的情况是每个QueryInterface调用都被跟踪用于调试或日志记录目的。能够关闭缓存可能允许某人诊断可能会延迟发生的问题。

下面是一些关于撕裂接口的链接供您参考。

ATL Tear-Off Interfaces @ CodeGuru

CComTearOffObject Class @ MSDN

+0

所以它是调试,当COM对象并不真正保持到COM规范。然而,它是在AppDomain的级别,而不是每个COM接口? – 2009-10-20 20:38:25

+0

是的,它应该适用于AppDomain中已知的COM对象的所有实例。 可能会更简洁地说,缓存不是由于使用COM对象而预期的行为,因此如果没有此选项可能会由于副作用而导致某些实现陷入麻烦。 – meklarian 2009-10-20 21:47:46