2012-04-10 59 views
3

我正在使用第三方dll开发我的应用程序,它是一个COM对象。我试图使我的应用程序隔离,使用COM免注册。但我无法找到很好的示例/步骤/教程来了解如何做到这一点。请告诉我我所做的是正确还是错误。COM例外:80040154,已经提供了清单

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

System.Runtime.InteropServices.COMException was unhandled
Message=Retrieving the COM class factory for component with CLSID {7B3A2D19-1D82-4DF6-8939-B730058A5535} failed due to the following error: 80040154 Class not registered (Exception from 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

这可能是由于此步骤:

Provide external manifest without removing the internal RT_MANIFEST inside the dll.

与Windows Server 2003 SP1的Windows启动会忽略内部清单,如果一个文件有一个内部清单。您可以尝试在blogKB article中提及的注册表设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest (DWORD) to 1。这将使Windows查看外部清单而不是内部清单。

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

+0

据我所知,Windows将优先考虑内部而不是外部(对于Windows Server 2003和更高版本的Windows,为true)。所以我尝试使用mt.exe在DLL和exe文件中嵌入清单。仍然不起作用。 不,更改注册表设置不是一个好主意。 :( – 2012-04-12 07:32:59