[教程]在 Delphi 中调用 .Net 的 DLL

首先,明确一点:本文提供的方法,要求 .NET 的 DLL 必需编译为支持 COM 接口的模式,这样子,它就可以让其它语言通过 IDispatch 接口进行调用。具体的教程,请自行百度。下面是网上搜到的一个截图。

生成后有 TLB 和 DLL 两种类型的文件,TLB 存贮了 DLL 中相关的接口的定义。接下来,如果我们要在 Delphi 使用这个 C# 的动态链接库,那么首先我们需要调用 .NET 的 regasm 注册这个 DLL 到系统中。regasm 这个程序的位置取决于具体的 .Net 运行时版本:

  • 2.x/3.x : %WinDir%\Microsoft.NET\Framework\v2.0.50727
  • 4.x : %WinDir%\Microsoft.NET\Framework\v4.0.30319

这个根据创建 DLL 时的 .NET 的目标环境来选择就好。假设我们使用 4.0 的 regasm。

%WinDir%\Microsoft.NET\Framework\v4.0.30319\regasm d:\temp\dll_dotnet.dll

接下来我们要在 Delphi 中调用这个 DLL 的函数来完成相应的操作。这里有好几种方式,你可以用你喜欢的方式来完成:

1、通过 OleVariant 来处理。这种处理方式是最简单的,参考示例如下:

var
  V:OleVariant;
const
  ITestLib:TGuid='{EA2F140A-108F-47AE-BBD5-83EEE646CC0D}';//注意这个ID要正确或者用那个参数格式为 xxx.yyy 的 CreateOleObject 返回实例,注意返回的实例强制转换为 IDispatch 接口,否则会因为 OleVariant 的类型不对,而无法调用。
begin
  V:=IDispatch(CreateComObject(ITestLib));
  ShowMessage(VarToStr(V.Add(1,2)));
end;

2、选择 Components->Import Component,然后选择 Import .net assembly,然后按照向导添加要导入的 dll,最后就会生成对应的导入单元,然后就简单了,直接按照普通的 Com 创建对应的 TOleServer 类型的实例就可以了。

3、利用 LoadTypeLib 来加载获取 ITypeInfo 信息,然后再调用其 CreateInstance 接口创建实例,最终再使用 IDispatch 的 Invoke 接口实现调用。

分享到: