将TLB导入C#

11

我想要将一个类型库(tlb)导入到C#中。

如何将.tlb导入到.cs代码文件中?


使用命令行工具tlibimp.exe,Borland Delphi可以将.tlb导入到.pas中:

C:\Develop>tlibimp.exe SopQuotingEngineActiveX.tlb
Borland TLIBIMP Version 5.1  Copyright (c) 1997, 2000 Inprise Corporation
Type library loaded...
Created C:\Develop\SopQuotingEngineActiveX_TLB.dcr
Created C:\Develop\SopQuotingEngineActiveX_TLB.pas

现在有一个.pas源代码文件,其中包含了编译后的类型库(tlb)文件中的常量、枚举和接口:

SopQuotingEngineActiveX_TLB.pas:

unit SopQuotingEngineActiveX_TLB;

interface
...
const
   CLASS_XSopQuotingEngine: TGUID = '{3A46FFB8-8092-4920-AEE4-0A1AAACF81A0}';
...

// *********************************************************************//
// Interface: IXSopQuotingEngine
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {AA3B73CC-8ED6-4261-AB68-E6AE154D7D52}
// *********************************************************************//
  IXSopQuotingEngine = interface(IDispatch)
    ['{AA3B73CC-8ED6-4261-AB68-E6AE154D7D52}']
    procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
    procedure OnEndPage; safecall;
    procedure Connect(const ConnectionString: WideString); safecall;
    procedure Disconnect; safecall;
    function  xmlRateQuote(const xmlQuote: WideString): WideString; safecall;
  end;
  ...

  CoXSopQuotingEngine = class
    class function Create: IXSopQuotingEngine;
  end;

.NET C#中导入类型库的等效方法是什么?


注意:我已经尝试使用随Windows SDK一起提供的tlbimp.exe,但它将类型库导入到受控程序集dll中:

C:\Develop>"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64\tlbimp" SopQuotingEngineActiveX.tlb
Microsoft (R) .NET Framework Type Library to Assembly Converter 4.0.30319.1
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : warning TI3002 : Importing a type library into a platform agnostic assembly.  This can cause errors if the type library is not truly platform agnostic.
TlbImp : Type library imported to SopQuotingEngineActiveX.dll

.NET C#中导入类型库到本地C#代码的等效方法是什么?


注意:我想要看到一个包含所有必需接口、常量、枚举的.cs代码文件,以便调用COM对象。例如:

SopQuotingEngineActiveX.cs

[ComImport, Guid("AA3B73CC-8ED6-4261-AB68-E6AE154D7D52")
       ]
public interface IXSopQuotingEngine
{
    void OnStartPage(object AScriptingContext);
    void OnEndPage();
    void Connect(string ConnectionString);
    void Disconnect();
    string xmlRateQuote(string xmlQuote);
}

[ComImport, Guid("3A46FFB8-8092-4920-AEE4-0A1AAACF81A0")]
public class XSopQuotingEngineClass
{
}

(但没有错误)

另请参阅


1
为什么仅有汇编代码不够?你可以在项目中引用它,如果想要查看其内容,也可以反射它。为什么需要C#源代码呢? - Marius Bancila
@Marius Bancila:单一二进制文件。 - Ian Boyd
@IanBoyd 你最终是如何解决这个问题的?我已经看到下面的答案,但这让我非常不开心... :'[ - MoonKnight
最终我使用了Reflector将程序集的全部内容复制并粘贴到一个新的.cs文件中。你必须小心使用Reflector,而不是ILSpy。ILSpy存在一个错误,它不能保持接口方法的相同顺序。这会导致虚拟表偏移量全部错误,并且代码以可怕和不可能的方式失败。 - Ian Boyd
2个回答

14

您已经找到了 .Net 的等效工具 Tlbimp.exe - 其输出是一个程序集,遗憾的是无法更改。

如果您想查看接口等的 C# 声明,则应在生成的程序集上使用反编译器(例如 ReflectorILSpy)。此外,Microsoft 官方建议修改这些声明的方法是修改生成的 MSIL - 请参见自定义主互操作程序集

目前唯一的替代方法是手动创建所有声明。


1
+1 不能完成。 +1 对于 ILSpy 我之前不知道。 - Ian Boyd

2

要注册类型库,您应按如下所示使用regtlib.exe:

导航到以下文件夹并将文件路径复制到剪贴板: C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe (实际文件夹路径可能因计算机上安装的 .NET Framework 版本而异。) (此文件也可能位于 C:\WINDOWS\system32\URTTemp\regtlib.exe)

复制路径 打开命令窗口并执行以下命令:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe "完整的 .TLB 文件路径"

这应该会显示“Registration .......tlb successful”。

打开 Visual Studio 并创建一个 C# 控制台应用程序。右键单击“引用”,选择“添加引用...”,然后浏览到 tlb 文件。

这应该会提供对 dll/tlb 的引用。右键单击名称,选择“在对象浏览器中查看...”展开树以查看可用的所有类型、调用和事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接