2010-09-01 63 views
0

说我有一个COM类型的负载,我想检查一个特定类型是否已经注册。我可以使用Activator.CreateInstance来实际尝试和创建该类,但是我想知道是否有一种更简单的方法实际上是事先检查该类是否实际注册。如何测试COM类型是否已注册?

我不想直接去注册表 - 我正在寻找一些易于使用的东西,如上面的Activator.CreateInstance调用。

谢谢

回答

1

注意: Activator.CreateInstance不会直接创建COM类实例,它需要生成并安装互操作程序集(例如通过tlbimp.exe)—,但这在此没有任何区别。

最简单的方法来检查而不读取注册表是尝试创建一个实例,并捕获由于类型不可用而可能出现的异常。 (例如COMException如果底层组件没有正确安装,TypeLoadException(IIRC)如果互操作程序集丢失。)

+0

好点 - 我对COM互操作如何工作的理解是非常基本的。谢谢你的回答 - 这就是我会天真地做到这一点。 出于兴趣,如果您必须处理32 \ 64位问题,注册表方式不是一个痛苦吗? – cristobalito 2010-09-01 08:30:28

+1

@cristobalito可能有很多地方需要检查,通过限制到不合适的情况,您可以将其减少到HKCR:\ CLID \ \ InProcServer32和HKCU:\ Software \ Classes \ CLSID \ \ InProcServer32(注册表路径重映射将为您处理32/64位问题)。 – Richard 2010-09-01 09:00:06

+1

如果您使用注册表解决方案,则还需要照顾“免费注册COM”。 – Vagaus 2010-09-01 15:19:11