【发布时间】:2011-08-15 14:25:18
【问题描述】:
我想将类型库 (tlb) 导入 C#。
如何将.tlb 导入.cs 代码文件?
Borland Delphi 可以使用命令行工具tlibimp.exe 将.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;
将类型库导入本机 C# 代码的 .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
将类型库导入本机 C# 代码的 .NET 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
{
}
(除了没有错误)
另见
【问题讨论】:
-
为什么装配不够?你可以在你的项目中引用它,如果你想看看它包含什么,你可以反思它。为什么需要 C# 源代码?
-
@Marius Bancila:单个二进制文件。
-
@IanBoyd 你最后是怎么解决这个问题的?我已经看到了下面的答案,但这让我很不高兴......:'[
-
@Killercam 最终我使用 Reflector 将程序集的全部内容复制并粘贴到一个新的
.cs文件中。你必须小心使用 Reflector,而不是 ILSpy。 ILSpy 中存在一个错误,即它不会使接口方法保持相同的顺序。这会导致您的虚拟表偏移全部错误,并且代码以可怕和不可能的方式失败。