我正在.net 3.5中阅读应用程序域的文档,并遇到了SandboxInterop。医生说
获取或设置一个值,该值指示是否对应用程序域中的互操作调用禁用接口缓存,以便对每个调用执行QueryInterface。
但是--为什么想要禁用QueryInterface的缓存?
(一个快速的谷歌找不到任何能解释这条路的东西?)
发布于 2009-10-20 19:24:40
在典型的操作中,通常没有理由担心QueryInterface调用被缓存。
但是,其他各方可以创建组件,在这些组件中,未完成接口的数量与组件的操作相关联。此外,还有一些异常值,其中从COM对象接收的接口有一个实现,这可能会使控制对象的生存期变得更加困难。
例如,用ATL编写的组件可以使用tearoff接口创建。这些分离在主对象的二进制布局中不可用,通常是在与其父对象协调的另一个隐藏对象上实现的。由于成功的QueryInterface调用隐式地算作AddRef调用,如果缓存接口引用,则可以延长tearoff提供程序的生存期。此外,还可能存在这样一种情况,即对象只提供特定接口的一个分离,目的是一次只有一个使用者通过该接口。如果当第二个请求失败时向两个使用者发出相同的副本,则缓存副本可能会违反该行为。
最后,更有可能的情况是,为了调试或日志记录目的,可能会跟踪每个QueryInterface调用。能够关闭缓存可能会让人诊断问题,哪些问题可能会随着缓存的启动而延迟。
下面是一些关于tearoff接口的链接,供您参考。
ATL撕掉接口@ CodeGuru
CComTearOffObject类@ MSDN
https://stackoverflow.com/questions/1595942
复制相似问题