【问题标题】:using classes inside a COM exe from .Net使用 .Net 的 COM exe 中的类
【发布时间】:2010-11-18 13:43:17
【问题描述】:

我有一个 .exe 文件,里面有 COM 类——这些来自 C++,而不是 .net ComVisible 类型

我想在我的 .net 项目中使用这些类,但我无法添加对 exe 的引用;当我尝试时,我得到了

DIALOG BOX: 

---------------------------
Microsoft Visual Studio
---------------------------
A reference to 'C:\Program Files\blah\blah.exe' 
could not be added. Please make sure that the 
file is accessible, and that it is a valid 
assembly or COM component.
---------------------------
OK   
---------------------------

tlbimp 也失败了;

TLBIMP OUTPUT: 

> tlbimp blah.exe

Microsoft (R) .NET Framework Type Library 
to Assembly Converter 3.5.30729.1

Copyright (C) Microsoft Corporation.  All rights reserved.

TlbIml : error TI0000 : The input file 
'c:\program files\blah\blah.exe' is not
 a valid type library

但看起来确实有可用的 COM 类;在我的HKEY_CLASSES_ROOT hive 中,我可以看到不同 COM 类的条目;

REGISTRY ENTRY:

\HKEY_CLASSES_ROOT
    \CLSID
        \{456B14EA-4CCC-11D4-BB91-0020AFC894E9}
            @="COM.Classname"
            \InprocHandler32
                @="ole32.dll"
            \LocalServer32
                "LocalServer32"=hex(7) ...
                @="C:\\PROGRA~2\\blah\blah.exe"
            \ProgID
                @="COM.Classname"

有人知道我如何,甚至是否可以在 .net 项目中使用这些 COM 类吗?

【问题讨论】:

  • 后期绑定可能值得一试。不过,另一方面,tlbimp 正在告诉您问题所在。它是可执行文件,而不是类型库 (dll)。

标签: c# .net com com-interop tlbimp


【解决方案1】:

有三种分发类型库的方法:单独在 .tlb 文件中,或作为 .dll 或 .exe 文件中的嵌入资源。但是,使用 COM 组件分发类型库文件并不是强制性的。

通常在 HKCR\CLSID{CLSID} 下会有一个 TypeLib 注册表项,它的默认值包含 typelib id。 (oleview.exe 对于跟踪这些注册表项非常有用)。如果您的注册表不包含 TypeLib 键,那么很可能您的组件没有随类型库一起分发。

tlbimp.exe 可以在 .dll 或 .exe 文件中导入任何嵌入式类型库资源,因此上面报告的错误向我表明,您的给定可执行文件中没有嵌入式类型库。您可以通过使用资源视图查看 exe 来确认这一点。我忘记了 Windows SDK 资源查看器的名称,但是你可以在这里找到一个免费的:MiTec Exe Explorer

如果 exe 没有 TYPELIB 资源,则无法创建 .net 互操作库。然后,您唯一的选择是联系组件的制造商并要求提供类型库。如果这不可行,您可以使用后期绑定来调用组件。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2013-06-18
    • 2011-06-23
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2017-04-28
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多