来自C#/ VB.Net DLL的间歇性E_NOINTERFACE错误连接到C ++ ActiveX Exe

时间:2012-01-13 18:29:04

标签: .net com activex com-interop

我试图弄清楚为什么会发生这种错误并确定是否可以阻止它。

所以,这都是在Windows XP Pro SP3上运行的VS2008中。我正在为名为FalconView 4.1.1.6的映射应用程序编写插件工具栏DLL。 FalconView(fvw.exe)是一个activex应用程序。工具栏通常工作正常,除了偶尔会出现颈部疼痛(我收到的错误信息是在这个问题的最后,因为它很长)。

我有时可以通过在测试笔记本电脑上安装我们软件的发行版本,用调试DLL替换发行版DLL(用于测试目的),卸载工具栏,然后安装工具栏的下一个版本来强制显示此错误消息。轰,有错误。写入和调试时也会发生错误,但不太可预测。我可以通过从项目中删除对fvw的引用,退出vs2008,取消注册Interop.fvw.dll的所有副本(从FalconView提供的tlb文件生成),运行“fvw / regserver”,重新加载,在我的开发机器上解决这个问题。该项目,并将Interop.fvw.dll添加回项目。太痛苦了!这里发生了什么?有办法防止这种情况吗?

谢谢!

有问题的错误: System.InvalidCastException:无法将类型为'fvw.MapClass'的COM对象强制转换为接口类型'fvw.IMap'。此操作失败,因为对IID为“{E353BC6C-E8AB-11D3-80B9-00C04F60B086}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) 。    at System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr,Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture,String [] namedParameters)    at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams)    at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData& msgData)    at fvw.MapClass.GetElevation(Double lat,Double lon,Int32& elevation)    在Toolbar.rpuav_com.SendElevationData(Hub Station)

请注意{E353BC6C-E8AB-11D3-80B9-00C04F60B086}在我查找时位于注册表中。

4 个答案:

答案 0 :(得分:2)

Uggg ......我真的希望我不会回答我自己的问题。某种程度上感觉很错误。

无论如何,问题在于使用了Interop.fvw.dll文件。我们应该使用FalconView提供的那个(使用也提供的fvw.tlb构建)。我们的项目引用了dll和Visual Studio在构建我们的插件的Release版本时将它复制到我们的release文件夹,并在我们调试时复制到Program Files文件夹。不知何故,我不明白这一点,一个新的Interop.fvw.dll被生成(可能是一个实习生,其他员工,或者只是魔术?),血腥的东西在问题项目中被“卡住”。

如何判断重新生成新的interop dll?公钥标记全为零,而FalconView制造商的公钥标记为实际数字。现在,只要他们也签署他们的集会。

我的修复是:

  1. 从项目参考
  2. 中删除有问题的Interop.fvw.dll
  3. 保存项目并退出visual studio
  4. 在项目的Program Files文件夹中运行“regasm / u Interop.fvw.dll”
  5. 运行“fvw / regserver”以获得良好的衡量标准
  6. 重新加载项目并重新引用正确的FalconView Interop.fvw.dll
  7. 清理项目构建,然后重建
  8. 感谢大家的帮助!非常感谢!

答案 1 :(得分:1)

  

我有时可以通过安装版本来强制显示此错误消息   我们在测试笔记本电脑上的软件版本,取代了发行版DLL   使用调试DLL(用于测试目的),卸载工具栏,和   然后安装下一个版本的工具栏。热潮,有   错误。

类型库导出器(和Visual Studio)为类型库ID和类ID生成的GUID使用程序集版本作为哈希的一部分。因此,如果您的程序集版本更改(即使它只是构建版本或修订版本号)将导致这些GUID更改。如果您的AssemblyVersionAttribute设置为自动生成的版本号(如1.0。*),则必须注意这一点。

要避免此问题,请将程序集设置为具有静态版本号,或使用类和接口上的[Guid]属性指定自己的GUID。

答案 2 :(得分:0)

正在抛出/返回E_NOINTERFACE,因为所谓的接口未实现。通常,当您QueryInterface来自非NULL但未实现接口的对象时,就会发生这种情况。也就是说,它完全是应用程序特定的,不太可能与注册表设置相关。由于它是您的应用程序,您可以调试并查看您正在查询fvw.IMap的确切内容以及为什么它不会公开相关接口。

答案 3 :(得分:0)

我要走出困境并说E_NOINTERFACE错误来自于试图将对象从一个线程编组到另一个线程。

检查以确保为您尝试编组的接口注册了代理/存根DLL。