Delphi调用.net动态链接库DLL(非com,自动生成接口)

常见的.NET有C#、 VB.NET 等。随机微软的持续发力,.NET的市场份额越来越大,.NET的SDK也越来越多。简单的.NET调用,我们可以用COM的形式,或者自己写一个中转的dll来封装一下。

但以上两种方式都有各自的弊端,有些SDK没有导出COM接口,或者我们自己写的dll也不想导出,不想注册dll。甚至有时候,我们也不想再另外写一个.net的dll,毕竟还得去装一个vs。那么有没有简单方便的方法呢?

那就得说一说我们今天的主角了:DDNRuntime。

DDNRuntime全称Delphi .NET Runtime,是一个用Delphi调用.NET的库。仓库地址: 不在乎y/DDNRuntime-examples

简介

  • 支持delphi调用.NET Framework/.NET Core 系统dll和自己写的dll。
  • 支持调用C#、 VB.NET 编写的程序集。
  • 支持自动导入.net dll,并创建.net接口。

特性

  • 不需要COM的支持。
  • 使用非常的简单,只需要在Delphi中申明.NET的类型和方法即可。
  • 专门的翻译工具,输入一个或者多个.NET的程序集DLL,即可输出一个或者两个Delphi导入单元。
  • 支持接口类型。
  • 支持动态数组(一维数组)。
  • 支持委托类型。
  • 支持委事件。
  • 泛型类型(有限的支持。只支持XE8及以上且暂不支持嵌套的泛型,比如: DNICollection<DNKeyValuePair<TKey, TValue>> 这类的多层嵌套)。

要求

暂不支持

  • 二维数组。
  • 嵌套类泛型。

说了这么多,来看看DDNRuntime最有特色的代码吧。类似fmx安卓上调用Java的代码,上手非常容易。

unit uHash;
interface
  System.SysUtils,
  DDN.Runtime,
  DDN.mscorlib
{$IFDEF USE_NETCORE}
  ,DDNC.System.Security.Cryptography.Algorithms
  ,DDNC.System.Security.Cryptography.Csp
{$ENDIF};
  procedure TestProc;
implementation
function BytesToString(value: TBytes; AEqValue: string): string;
begin
  Result := TDNBitConverter.DNClass.ToString(value).Replace('-', '').ToLower;
  if Result.Equals(AEqValue) then
    Write('True ')
  else Write('False ');
procedure Hash_SHA1;
  sha1: DNSHA1;
  result: TBytes;
begin
  Writeln('---------------Hash_SHA1---------------');
  sha1 := TDNSHA1Managed.Create;
  result := sha1.ComputeHash(BytesOf('11111111111111aaaa'));
  Writeln('result: ', BytesToString(result, '0d403430ba5307571f77a017cc1b67c1784a94a4'));
  // 0d403430ba5307571f77a017cc1b67c1784a94a4
procedure Hash_SHA256;
  sha256: DNSHA256;
  result: TBytes;
begin
  Writeln('---------------Hash_SHA256---------------');
  sha256 := TDNSHA256Managed.Create;
  result := sha256.ComputeHash(BytesOf('11111111111111aaaa'));
  Writeln('result: ', BytesToString(result, '2ad87b450f4540dc1ed6c3fe1785fa5a75b26399cb07537da96e76ce26384fd6'));
  //2ad87b450f4540dc1ed6c3fe1785fa5a75b26399cb07537da96e76ce26384fd6
procedure Hash_MD5;
  md5: DNMD5CryptoServiceProvider;
  result: TBytes;
begin
  Writeln('---------------Hash_MD5---------------');
  md5 := TDNMD5CryptoServiceProvider.Create;
  result := md5.ComputeHash(BytesOf('11111111111111aaaa'));
  Writeln('result: ', BytesToString(result, 'd071a85745b8a9befb4f028bcae7f3e9'));
  // d071a85745b8a9befb4f028bcae7f3e9
procedure TestProc;
begin