3

我正在使用第 3 方 dll 开发我的应用程序,它是一个 COM 对象。我正在尝试使用免注册 COM 使我的应用程序隔离。但我真的找不到关于如何做这一切的好例子/演练/教程。请告诉我我所做的是对还是错。

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

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

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

我做了:

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

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

显示 FileVersion 和 ProductVersion 的属性

请告诉我我哪里做错了?我是否为清单提供了错误的信息?我如何知道清单需要更多信息?

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

4

1 回答 1

1

这可能是由于这一步:

提供外部清单而不删除 dll 中的内部 RT_MANIFEST。

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

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

于 2012-04-10T18:00:03.210 回答