【问题标题】:Reference typelib-less COM EXE from .NET project从 .NET 项目中引用无类型库的 COM EXE
【发布时间】:2011-10-24 10:06:21
【问题描述】:

我有一个没有嵌入式类型库的 VB6 标准 EXE。我想从该可执行文件生成一个互操作程序集并从 .NET 项目中引用它。这应该允许我从 .NET 实例化可执行文件中定义的 COM 类。

由于我没有类型库,我尝试从头开始创建 IDL,使用 MIDL 生成类型库,并从类型库生成互操作程序集。我可以从我的 .NET 项目中引用互操作程序集,但仍然无法实例化任何 COM 类。我相信我的互操作程序集不知道 EXE,因此无法实际执行我调用的代码。

我已经成功地从 .NET 实例化了在 VB6 ActiveX DLLs 中定义的 COM 类,其中互操作程序集知道包含实现的相应 COM DLL 的 ClassID。

在我从头开始创建的 IDL 中,我应该使用什么作为库定义的 UUID?这应该以某种方式引用EXE吗?

[
    uuid(WHATUUID-SHOU-LDII-NCLU-DEHEREXXXXXX),
    version(1.0),
    helpstring("for TLB on EXE")
]
library MyExe { ... }

These questions 很接近,但我仍然卡住了。我正在尝试做的事情可能吗?我宁愿避免后期绑定。感谢您的帮助。

【问题讨论】:

    标签: c# .net com vb6 interop


    【解决方案1】:

    互操作库不应该知道 EXE,这就是 COM 的工作方式。告诉服务器应该如何启动的是 CLSID 键。 InProcServer32 与 LocalServer32。

    当您编写自己的 IDL 时,可能会出现一百万种错误。如果您没有类型库,则猜测接口和 coclass 的正确 guid 并非易事。如果你弄错了,那么你就不能创建 COM 类。我很确定类型库嵌入在 vb6 ActiveX .exes 中,我记得没有不嵌入它的选项。要进行验证,请使用 Visual Studio 的 File + Open + File 并选择 .exe。您将获得嵌入式资源,如果您看到 TYPELIB,您会很高兴。打开节点,右击 ID 1 并使用 Export 将其导出为 .tlb 文件。

    【讨论】:

    • +1 我 99.9% 确定类型库总是嵌入在 VB6 ActiveX EXE 中
    • 我刚刚编辑了我的问题以澄清它是 VB6 标准 EXE,而不是 ActiveX EXE。当我打开 EXE 时,Visual Studio 确实没有显示类型库。
    • 您尝试执行的操作是不可能的,客户端程序只能使用 ActiveX EXE。我猜不出您可能将什么用作 IDL 的来源。
    猜你喜欢
    • 2016-11-18
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多