运行时可调用包装器(RCW)范围 - 进程或应用程序域?

Sun*_*nov 6 .net com interop appdomain marshalling

在引用非托管COM对象时,Runtime Callable Wrapper(RCW)的范围是什么?根据文件:

无论该对象上存在多少引用,运行时都会为每个COM对象创建一个RCW.

如果我不得不"猜测" - 这个解释应该意味着"每个过程一个",但它真的吗?我们非常欢迎任何其他文件.

我的应用程序在自己的应用程序域(它是Outlook插件)中运行,我想知道如果我在循环中使用Marshal.ReleaseComObject(x)直到它的计数达到0(如建议的话)会发生什么.它会从其他插件中释放引用(在同一个Outlook进程中的其他应用程序域中运行)吗?

编辑:完美 - 现在混乱更大.基于2个答案(来自Lette和Ilya),我们有2个不同的答案.官方MSDN文档说每个进程(版本2.0+),但它缺少ver的这句话.1.1的文件.

与此同时,在Mason Bendixen的文章中,它表示它是每个appdomain.

由于他的文章已经过时(2007年4月),我已经给他发了一封电子邮件要求澄清,但是如果其他人必须添加一些东西,请做.

谢谢

Ily*_*kov 3

在托管中,我们有一个将规范 IUnknown 映射回 RCW 的每个应用程序域缓存。当 IUnknown 进入系统时(通过编组调用、通过激活、作为方法调用的返回参数等),我们检查缓存以查看 COM 对象是否已存在 RCW。如果存在映射,则返回对现有 RCW 的引用。否则,将创建新的 RCW 并添加缓存映射。

来自梅森的博客