4

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

4 回答 4

6

80070002 是文件未找到错误。

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

于 2009-06-17T16:08:19.097 回答
2

嗯,0x80070002 表示找不到文件,所以我会检查一下 COM 注册中指向的 DLL 是否确实存在于您的机器上

于 2009-06-17T16:06:58.817 回答
1

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

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

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

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

于 2014-04-01T15:38:06.703 回答
0

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

于 2010-03-13T05:12:05.910 回答