【问题标题】:Call .TLB COM Library from C#从 C# 调用 .TLB COM 库
【发布时间】:2014-02-28 14:53:12
【问题描述】:

我有一个名为“GrpSvr.tlb”的旧 .TLB 文件,它包含一个名为 GrpCall 的类。我已经使用regtlibv12.exe 在我的Win7 x64 机器上注册了.tlb,它工作正常。我想从 C# 调用这个库的方法,所以首先我尝试了:

Type objectType = System.Type.GetTypeFromProgID("GrpSvr.GrpCall"); 
dynamic thirdPartyDLLObject = System.Activator.CreateInstance(objectType);

但这会为objectType 返回null

问题 1. 我可以以这种方式调用我的 .TLB 文件吗?在这种情况下我做错了什么?

后来我决定放弃这种方法

Import TLB into C#

其中描述了如何使用MSs Type Library Importer 创建 C# DLL。我遵循了这一点,并使用以下命令从GrpSrv.tlb 创建了GrouperServer.dll

C:\Program Files (x86)\Microsoft Visual Studio 12.0>tlbimp F:\Groupers\DRGROUP\GrpSvr.tlb /out:C:\GrouperServer.dll /nam espace:GrouperServer Microsoft (R) .NET Framework 类型库到程序集转换器 4.0.30319.33440 版权所有 (C) 微软公司。保留所有权利。

TlbImp : 类型库导入 C:\GrouperServer.dll

然后我将此 DLL 导入到我的 C# 项目中(并在 this answer 之后设置 Embed interop Types = false)并尝试通过调用该类

GrouperServer.GrpCallClass grouperServer = new GrouperServer.GrpCallClass();

但这不起作用,在运行时我收到以下错误:

在 DrGroupIN.exe 中发生了“System.Runtime.InteropServices.COMException”类型的第一次机会异常

附加信息:检索具有 CLSID {FFB54BC4-B15E-11D1-99BC-0000E803C444} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154 (REGDB_E_CLASSNOTREG))。

遵循

中给出的建议

Retrieving the COM class factory for component with CLSID {XXXX} failed due to the following error: 80040154

然后我将项目设置为以 x86 为目标,但这在这种情况下没有帮助。

问题 2:为什么会出现这个错误,我该如何解决?

【问题讨论】:

  • 它在一个通用文件夹中,没有特别之处......

标签: c# dll import com typelib


【解决方案1】:

是的,你做错了。类型库不是 COM 服务器,永远不需要使用 regtlibv12.exe。您需要阅读异常以了解它试图告诉您的内容,就像数以万计的 Google 点击一样,COM 服务器未注册。

COM 服务器是可执行代码,通常存储在 .dll 中。有时是 .ocx 或 .exe。需要一个安装步骤来注册该文件,以便以后当程序尝试创建服务器实现的 COM 对象时 COM 可以找到它。 Regsvr32.exe 实用程序是一种非常常用的方法,但您应该始终使用供应商或作者提供的安装程序。这可确保将可执行文件复制到您的计算机上并写入注册表项。包括用于类型库的那些。异常告诉你这没有完成,COM 找不到告诉它文件存储位置的注册表项。

.tlb 文件仅描述 COM 组件,它告诉编译器声明的样子。帮助编译器生成正确的代码以使用组件,并在代码错误时告诉您。它是元数据,非常类似于 .NET 程序集中的元数据,描述了程序集实现的 .NET 类型。它通常作为资源嵌入到 DLL 或 EXE 中,就像元数据嵌入到 .NET 程序集中一样。您可以使用 OleView.exe、File + View Typelib 来查看它。 Tlbimp.exe 也使用它,这是一个 .NET 实用程序,可将类型库转换为 .NET 互操作程序集,将声明转换为 CLR 可以轻松理解的格式。

无法帮助您找到正确的安装程序,它不是标准的。

【讨论】:

  • 非常感谢汉斯。确实有一百万个谷歌条目,但没有一个像你刚刚给我的那样描述清楚。这是一个很好的答案......也许我在这方面的知识缺乏让我蒙蔽了双眼。
【解决方案2】:

将 GrpSvr.Dll 及其依赖项放在 exe 文件夹下,然后重试。该错误是因为它无法根据注册表中的 GUID 找到 GrpSvr.Dll。

或者您可以使用该 GUID 搜索注册表,您将找到一个指定 DLL 所在位置的条目。

调试此类错误的一个工具是系统内部工具包中的进程监视器,日志将为您提供有关exe如何搜索注册表和文件的详细信息,从日志中您应该找到丢失的部分。

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2011-03-06
    • 2014-03-05
    • 2016-12-01
    相关资源
    最近更新 更多