在.Net的COM exe中使用类

时间:2009-08-11 10:13:06

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

我有一个.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 clasess的条目;

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类?

1 个答案:

答案 0 :(得分:3)

分发类型库有三种方法:分别在.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互操作库。然后,您唯一的选择是联系组件的制造商并要求提供类型库。如果无法做到这一点,可以使用后期绑定来调用组件。