C#包装器接口错误:E_NOINTERFACE

Das*_*tic 3 c# com rcw

我正在尝试为我拥有的COM对象(名为SC_COM.dll)生成一个C#包装器,但是在将它与Visual Studio 2008(运行Vista)链接时遇到了一些问题.我需要使用COM DLL免费注册 - 我使用清单文件让Visual Studio了解SC_COM.dll,这似乎正在运行.我使用TblImp.exe生成我在Visual Studio 2008中引用的类型库(SC_COMtlb.dll),因此我可以使用我需要的DLL进行早期绑定.DLL与清单和可执行文件位于同一目录中.

这是问题:当我实例化对象并尝试在C#中调用其中一个方法时,它会抛出以下错误:

检测到错误:无法将类型为"SC_COMtlb.SCAccessObjClass"的COM对象强制转换为接口类型"SC_COMtlb.ISCUploader".此操作失败,因为对于具有IID"{C677308A-AC0F-427D-889A-47E5DC990138}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我不完全确定这个错误意味着什么 - 我已经对错误代码进行了搜索,而且它似乎是一个相对普遍的C#错误.所以我要在这里以错误的方式链接COM对象,还是有一些其他重要的步骤我可能会丢失?

我应该注意到,我不完全确定我生成的类型库(S\C_COMtlb.dll)是如何知道实际COM DLL的位置,因为它没有在系统中注册 - 我认为它只是看起来相同目录.这可能是问题,如果是这样,我怎样才能更好地将这两者联系起来?

Chr*_*ard 6

尝试将此添加到您的App.exe.manifest:

<comInterfaceExternalProxyStub 
  name="ISCUploader" 
  iid="{C677308A-AC0F-427D-889A-47E5DC990138}"
  proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
  baseInterface="{00000000-0000-0000-C000-000000000046}"
  tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />
Run Code Online (Sandbox Code Playgroud)

可以从Visual Studio生成的Native.Namespace.Assembly.Name.manifest中找到TLBID,如下所示:

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
Run Code Online (Sandbox Code Playgroud)

很长一段时间以来,我一直在反对这个问题,但是我找到了这些有用的参考资料并将它拼凑在一起,它对我有用: