【问题标题】:Can't instantiate COM component in C# - error 80070002无法在 C# 中实例化 COM 组件 - 错误 80070002
【发布时间】:2010-11-03 17:30:12
【问题描述】:

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

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

【问题讨论】:

  • 我希望你能发布问题所在,以帮助稍后到达这里的其他人......
  • 这个问题原来是我们公司特有的问题。基本上,我们的软件安装了一个 Windows Media 预览处理程序,该处理程序后来被卸载,但保留了一些注册表项。此预览处理程序已消失 - 因此未找到文件错误 - 但留下了一些注册表项,导致此问题。
  • 非常感谢您的更新!我一直在运行和关闭一台服务器,我们遇到同样的错误......我会记录任何细节,无论它们看起来多么抽象或无用。
  • 如果我没记错的话,我在注册表中搜索了 ID,然后在 OleView 中查找了对象。从那里,我开始意识到它指向的是我们一直在使用的旧 Windows Media Player 格式的预览处理程序。从注册表中删除该组件解决了这个问题。

标签: c# com interop com-interop


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      80070002 是文件未找到错误。

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

      【讨论】:

      • 感谢您的建议。我将运行depends.exe 并尽快回复您。
      • 谢谢,这帮助我找到了真正的问题。我将你的标记为答案。
      【解决方案4】:

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

      【讨论】:

      • 它指向 Windows Media Player COM 对象,当然,它存在于我的机器上,并且运行良好......嗯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      相关资源
      最近更新 更多