我在.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中运行。
任何人都可以帮我这个吗?..
如果您需要更多信息,请发表评论。感谢。
答案 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信息导致错误的组装。一旦我删除了注册表中的更高版本的条目,它就可以正常工作。
现在,我们只需要确保构建过程不会再次导致该问题。 :)