在C#中不能实例化COM组件 - 错误80070002(Can't instantiate

2019-09-16 10:58发布

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

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

Answer 1:

80070002是错误未找到文件。

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



Answer 2:

那么,0x80070002手段找不到文件,所以我检查,看是否DLL指出,在COM注册您的机器上实际存在



Answer 3:

如果应用程序池崩溃可能发生这个错误。 你可以检查你的代码是否存在任何功能或对象初始化重复以上最终。 这可能会导致内存泄露,并在最后一个应用程序池崩溃



Answer 4:

另外可能有用的信息。 我们看到它加载.NET组件传统的ASP web应用程序这个问题。 一个应用程序是很好,另一个没有。 同一台机器? 那么是什么原因? 我们不能让周围无法加载一个COM组件,只是错误号0x80070002错误正确。

最终,这个被固定在破碎应用程序的应用程序池只设置为相同的工作程序。 有关应用程序池的东西意味着该组件无法正确加载,相同的身份等(IIS 6)。

有在注册表中该组件一帮老版本号,但regasm总是这样做,这是在清理可怕的,我们甚至不得不写一个小工具,在开发机版本号之间移动时,它们全部删除。 但是,在这种情况下,那些版本号没有问题。

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



文章来源: Can't instantiate COM component in C# - error 80070002