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

时间:2009-06-17 16:04:37

标签: c# com interop com-interop

我正在尝试在我的机器上实例化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: 

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

4 个答案:

答案 0 :(得分:5)

80070002是找不到文件错误。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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