我正在使用第三方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环境下开发的。 (我不知道这是否相关..)
我做了:
顺便说一句,我也很好奇我应该在清单中的版本元素中使用哪个FILEVERSION或PRODUCTVERSION编号? (我试过了两个,都没有用过)
Properties showing FileVersion and ProductVersion http://i40.tinypic.com/qpjymf.png
请告诉我我哪里做错了?我是否为清单提供了错误的信息?我怎么知道清单需要哪些信息?
如果您需要更多信息,请告诉我。谢谢大家。
答案 0 :(得分:1)
这可能是由于这一步:
提供外部清单而不删除内部RT_MANIFEST 在dll里面。
从Windows Server 2003 SP1开始如果文件具有内部清单,Windows将忽略内部清单。您可以尝试blog和KB article中提到的注册机构设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest (DWORD) to 1
。这将使Windows查看外部清单而不是内部清单。
但是,如果要在多个系统上安装它,则必须在所有安装的系统上设置此标志。此设置是一个全局设置 - 影响所有应用程序,因此这可能不是一个好主意。