C# 包装器接口(interface)错误 : E_NOINTERFACE

标签 c# com rcw

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

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

Error detected: Unable to cast COM object of type 'SC_COMtlb.SCAccessObjClass' to interface type 'SC_COMtlb.ISCUploader'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{C677308A-AC0F-427D-889A-47E5DC990138}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

我不完全确定这个错误是什么意思——我搜索了错误代码,它似乎是一个相对普遍的 C# 错误。那么我是不是要以错误的方式链接 COM 对象,还是我可能遗漏了其他一些重要步骤?

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

最佳答案

尝试将此添加到您的 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}" />

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

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

我为此苦苦思索了很长一段时间,但我找到了这些有用的引用资料并将其拼凑在一起,它对我有用:

关于C# 包装器接口(interface)错误 : E_NOINTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/935768/

相关文章:

c# - 从 32 位应用程序通过 COM 调用 x64 程序集

vb.net - "Option Strict On disallows implicit conversions"执行不一致

C#: Action 委托(delegate)与显式委托(delegate)

c# - 从 2 个不同的字典构建 Json 字符串?

c# - ZXing Xamarin 在 IOS 上形成白色背景

c# - Action 链接鼠标悬停?

vba - 如何检测 COM 类方法是否在 VBA 中失败

java - 使用 Java 中的 COM .dll,而不使用 regsvr32 注册库

.net - 为什么在关闭带有 WebBrowser 控件的窗体时出现 RaceOnRCWCleanup 错误?