无法在C#中实例化COM组件 – 错误80070002

我正在尝试在我的机器上实例化Windows Media Player COM对象:

Guid mediaPlayerClassId = new Guid("47ac3c2f-7033-4d47-ae81-9c94e566c4cc"); Type mediaPlayerType = Type.GetTypeFromCLSID(mediaPlayerClassId); Activator.CreateInstance(mediaPlayerType); // <-- this line throws 

执行最后一行时,我收到以下错误:

 System.IO.FileNotFoundException was caught Message="Retrieving the COM class factory for component with CLSID {47AC3C2F-7033-4D47-AE81-9C94E566C4CC} failed due to the following error: 80070002." Source="mscorlib" StackTrace: at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at MyStuff.PreviewFile(String filePath) in F:\Trunk\PreviewHandlerHosting\PreviewHandlerHost.cs:line 60 InnerException: 

此相同代码适用于其他开发人员计算机和最终用户计算机。 出于某种原因,它只能在我的机器上失败。 可能是什么原因?

80070002是File Not Found错误。

我的猜测是你的机器缺少一个依赖。 尝试通过depends.exe运行com组件,看看是否安装了所有必需的库。

好吧,0x80070002意味着找不到文件,所以我要检查你的机器上是否存在COM注册中指向的DLL

如果应用程序池崩溃,则可能发生此错误。 如果有任何函数或对象初始化最终重复,您可以检查代码。 这可能导致内存泄漏,最后导致应用程序池崩溃

还可能有用的信息。 我们在一个加载.net组件的经典asp web应用程序上看到了这个问题。 一个应用程序很好,另一个不是。 同一台机器? 什么赋予了什么? 我们没有得到正确的错误,无法加载com组件,只有错误号0x80070002。

最后,只需将破坏的应用程序的应用程序池设置为与工作应用程序相同即可解决此问题。 关于应用程序池的一些事情意味着组件无法正确加载,相同的身份等(iis 6)。

注册表中有一堆旧的版本号用于该组件,但是regasm总是如此,它在清理方面很糟糕,我们甚至不得不编写一个小工具来删除它们在开发机器上的版本号之间移动时。 但在这种情况下,那些版本号不是问题。

结论:听起来像权限问题,但我知道什么..