我正在尝试为我拥有的 COM 对象(名为 SC_COM.dll)生成 C# 包装器,但在将其与 Visual Studio 2008(运行 Vista)链接时遇到一些问题。我需要使用 COM DLL 执行此免注册操作 - 我正在使用清单文件让 Visual Studio 了解 SC_COM.dll,并且这似乎有效。我使用 TblImp.exe 生成一个类型库 (SC_COMtlb.dll),我在 Visual Studio 2008 中引用该库,这样我就可以与我需要的 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 在哪里,因为它没有在系统中注册 - 我假设它只是看起来相同目录。这可能是问题所在吗?如果是,我怎样才能更好地将两者联系起来?

有帮助吗?

解决方案

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

我已经为此苦苦挣扎了很长一段时间,但我发现了这些有用的参考资料并将其拼凑在一起,它对我很有用:

其他提示

错误代码意味着Visual Studio中的认为的某一个目标应该是实现某个接口,但是当我试图“连接”到该接口的对象回答说,它不知道它。

我猜想,这个问题是在SC_COM.dll。 TLBIMP.EXE从存储在DLL内的元数据中提取类和接口信息并建立包装的类。

例如,如果是SC_COM用C ++编写,这可能如果DLL的创建者在IDL表示发生文件一个类实现该接口,但实际的代码不支持该接口。

下面是此DLL可能有问题的另一个常见来源:有时你必须实现一个ISomething2接口,从接口ISomething派生的类,但类的实现只承认ISomething2。如果您实现一个派生的接口,你必须认识到它的基本接口以及。这是一个常见的错误。

你有(和控制)为DLL的源代码?

哪个版本的Windows?由于Windows Vista中,内部清单覆盖的外部清单。默认情况下,C#可执行文件内部有体现,这意味着你的whatever.exe.manifest文件将被忽略。

如果你去的属性页的C#EXE,你会看到有一个“图标清单”的“应用程序选项卡”一节。设置“清单”到您的清单文件的名称,它会被嵌入,而不是默认的。

如果不工作,你可能需要做一些后期建立与MT.EXE步骤,以使用默认的内部一个合并的外部清单,并把合并后的清单回.EXE文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top