COM例外 - TYPE_E_CANTLOADLIBRARY?

时间:2011-04-18 15:58:33

标签: asp.net exception com registry

我在.Net网络应用程序中使用COM dll。这适用于多台不同的机器 但是在一台特定的机器上,我收到以下错误:

无法将“CServer.CApplicationClass”类型的COM对象强制转换为接口类型“CServer.ICApplication”。此操作失败,因为对于具有IID'{CF0DFA28-046B-4C7D-8AA9-F4B7477D8CAE}的接口的COM组件的QueryInterface调用由于以下错误而失败:加载类型库/ DLL时出错。 (来自HRESULT的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY))。

我已使用regsvr32命令注册了dll 我还为这个dll创建了一个COM +应用程序。 通过注册表运行搜索
我可以在很多地方找到钥匙。 我也尝试取消注册dll并将计算机上的所有引用删除到此dll。然后重新添加dll并重新注册它。

我编写了一个简单的Windows脚本文件来测试dll。这很好用。但是我的.net项目中存在问题,该项目在iis中运行。

任何人都可以帮我这个吗?..

如果您需要更多信息,请发表评论。感谢。

4 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,“TYPE_E_CANTLOADLIBRARY”消息。

<强>背景 我有一个使用Interop.ReferenceA.dll的项目。此文件是使用tlbimp ReferenceA.dll / out:Interop.ReferenceA.dll。

创建的

<强>解决方案: 当我使用RegDllView查看ReferenceA.dll时,我注意到ReferenceA.dll有一个子类,它是错误消息中显示的IID。 我查看了子类的源代码,发现它与Interop.ReferenceB.dll有依赖关系。

原来,子类需要Interop.ReferenceB作为类型库才能工作。所以我跑了这个:

regasm /tlb:Interop.ReferenceB.tlb Interop.ReferenceB.dll(使用了32位版本的regasm。)

错误消失了。

答案 1 :(得分:0)

确保您的AppPool设置为x86。另外,请确保您的程序集仅针对x86。

答案 2 :(得分:0)

我遇到了类似的问题。首先得到Access Denied,经过一些环顾解决后,才会遇到此错误消息(TYPE_E_CANTLOADLIBRARY)。请注意,我在Windows 7上运行COM +组件。

经过一些无效的尝试,包括弄乱了注册表,我的同事和我找到了一种方法来启动和运行:

1)取消注册你的dll(regsvr32 -u dllname)

2)确保从注册表中清除对dll的引用(先备份)

3)在组件服务中创建一个空的com +应用程序(服务器应用程序)

4)将应用程序ID复制到剪贴板

5)转到“c:\ program files(x86)\ Complus applications”并在剪贴板上创建一个带有id的文件夹

6)将你的dll复制到该文件夹​​并注册

7)返回组件服务并使用“c:\ program files(x86)\ Complus applications {* app id *}”

上的dll将组件添加到您创建的应用程序中

这对我来说。希望它有所帮助。

答案 3 :(得分:0)

我遇到了类似的问题,该错误是在我的PC上触发的,而不是在其他开发人员的PC上触发的。

事实证明,我已经在PC上测试了自动装配过程,该过程已更新了程序集的版本号,因此在注册表中注册的TLB的版本号比我们通常使用的版本号高。

当尝试获取接口时,服务器始终使用错误的TLB信息导致错误的组装。一旦我删除了注册表中的更高版本的条目,它就可以正常工作。

现在,我们只需要确保构建过程不会再次导致该问题。 :)