我有一个客户端应用程序,也是托管的。我想在我的应用程序中创建FIPreviewHandler的COM组件实例。
我有一个Interop程序集,定义了IPreviewHandler和相关接口。
当我使用GetTypeByCLSID()返回的类型使用正确的CLSID为FIPreviewHandler创建Activator.CreateInstance()的实例时,它会将其作为托管实例返回,因为它具有实际程序集可用,并跳过COM。当我尝试将此实例QI / cast为任何接口,例如IPreviewHandler时,它返回null,因为它被加载为托管对象,尽管由FIPreviewHandler实现的IPreviewHandler接口与我在Interop中拥有的接口相同,但它在不同的命名空间/程序集中,因此为null。如果它将返回一个COM实例/RCW(System.__ComObject),它不会考虑命名空间,并且会正常强制转换并返回有效实例。
FIPreviewHandler是一个32位组件,在64位Win7机器上,如果我将客户端应用程序编译为“Any CPU”,Activator.CreateInstance()将返回一个COM实例/RCW(System.__ComObject),因为它找不到64位实现的FIPreviewHandler,因此返回代理。在这种情况下,我的应用程序工作正常。但是当我将其编译为x86时,它会获得32位实现,并返回实际托管类的托管实例而不是COM实例,因此失败。
我无法使用FIPreviewHandler程序集中定义的接口,因为我必须为IPreviewHandler编写通用客户端,我的应用程序将与实现IPreviewHandler的任何组件一起工作,这对于访问FIPreviewHandler作为COM对象的基于C ++的客户端非常有效,但对于托管客户端则失败。
我希望我的问题讲清楚了,非常感谢您的任何帮助。