什么是AppDomainSetup.SandboxInterop属性?

时间:2009-10-20 16:49:43

标签: .net com interop

我正在使用.net 3.5中的app域的文档阅读并遇到SandboxInterop。文档说

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

为什么我是否希望禁用QueryInterface的缓存?

(快速谷歌找不到任何解释方法?)

1 个答案:

答案 0 :(得分:2)

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

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

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

最后,更可能的情况是可能会跟踪每个QueryInterface调用以进行调试或记录。能够关闭缓存可能允许某人诊断出事件可能被延迟的问题。

以下是有关撕裂界面的一些链接供您参考。

ATL Tear-Off Interfaces @ CodeGuru

CComTearOffObject Class @ MSDN