【发布时间】:2010-10-30 11:07:05
【问题描述】:
我正在尝试为我拥有的 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 在哪里的,因为它没有在系统中注册——我假设它只是看起来在同一目录中。这可能是问题所在吗?如果是,我怎样才能更好地将两者联系起来?
【问题讨论】:
-
> "...我不完全确定类型库如何...知道实际的 COM DLL 在哪里,因为它没有在系统中注册。" -- 这就是清单的来源。由于代码在出错之前已经达到了它所能达到的程度,我认为它可以很好地找到 COM DLL。如果您仍然不确定,请使用“模块”窗口来验证 COM DLL 是否被列为已加载。