COM例外:80040154,已提供清单

时间:2012-04-10 08:19:16

标签: c# manifest com-interop

我正在使用第三方dll开发我的应用程序,它是一个COM对象。我正在尝试使用COM免注册来隔离我的应用程序。但我无法找到关于如何做到这一切的好例子/ walkthough / tutorial。请告诉我,我所做的是正确还是错误。

我为原始dll创建了清单,使用tlbimp.exe生成了一个tyle库,添加了类型库作为项目的引用,正常实例化了该对象。即使我已经提供了清单文件,我仍然会收到此错误:

  

System.Runtime.InteropServices.COMException未处理
  Message =使用CLSID检索组件的COM类工厂   {7B3A2D19-1D82-4DF6-8939-B730058A5535}因以下原因失败   错误:80040154未注册类(HRESULT异常:   0x80040154(REGDB_E_CLASSNOTREG))。

用Google搜索,似乎有很多人指向构建配置,但我已经将我的构建设置为使用x86。我很确定dll也是在x86环境下开发的。 (我不知道这是否相关..)

我做了:

  • 提供外部清单而不删除dll中的内部RT_MANIFEST。
  • 使用mt.exe更新RT_MANIFEST。
  • 使用上述两者生成的类型库。

顺便说一句,我也很好奇我应该在清单中的版本元素中使用哪个FILEVERSION或PRODUCTVERSION编号? (我试过了两个,都没有用过)

Properties showing FileVersion and ProductVersion http://i40.tinypic.com/qpjymf.png

请告诉我我哪里做错了?我是否为清单提供了错误的信息?我怎么知道清单需要哪些信息?

如果您需要更多信息,请告诉我。谢谢大家。

1 个答案:

答案 0 :(得分:1)

这可能是由于这一步:

  

提供外部清单而不删除内部RT_MANIFEST   在dll里面。

从Windows Server 2003 SP1开始如果文件具有内部清单,Windows将忽略内部清单。您可以尝试blogKB article中提到的注册机构设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest (DWORD) to 1。这将使Windows查看外部清单而不是内部清单。

但是,如果要在多个系统上安装它,则必须在所有安装的系统上设置此标志。此设置是一个全局设置 - 影响所有应用程序,因此这可能不是一个好主意。