You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi XE中调用C# DLL的异步REST方法?

问题解决方案

一、无需注册调用C# DLL的可行方案

可以直接通过非托管导出实现Delphi调用C# DLL,完全不需要注册(跳过COM注册类操作)。核心是把C#方法转换成标准C风格导出函数,适配Delphi的调用逻辑。

1. 处理async异步方法的适配

Delphi无法直接识别.NET的Task异步模型,必须先对异步方法做包装:

方案A:包装为同步导出方法

将异步逻辑同步等待完成,导出同步函数给Delphi调用:

using System.Runtime.InteropServices;

public class RestApiWrapper
{
    private static readonly HttpClient _httpClient = new HttpClient();

    // 导出供Delphi调用的同步方法
    [DllExport("foo", CallingConvention = CallingConvention.StdCall)]
    public static IntPtr Foo([MarshalAs(UnmanagedType.LPWStr)] string bar)
    {
        // 同步等待异步操作完成
        string result = _httpClient.GetSomethingAndReturnString(bar).GetAwaiter().GetResult();
        // 将字符串转为非托管指针,Delphi需调用释放方法回收内存
        return Marshal.StringToHGlobalUni(result);
    }

    // 配套的内存释放方法,避免泄漏
    [DllExport("FreeString", CallingConvention = CallingConvention.StdCall)]
    public static void FreeString(IntPtr strPtr)
    {
        Marshal.FreeHGlobal(strPtr);
    }
}

注:需要安装UnmanagedExports NuGet包(仅支持.NET Framework);若用.NET Core/.NET 5+,可改用NativeAOT编译或C++/CLI中间层。

方案B:回调式异步导出

如果不想阻塞Delphi线程,可设计回调模式,异步完成后通知Delphi:

// 定义与Delphi匹配的回调委托
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void FooResultCallback([MarshalAs(UnmanagedType.LPWStr)] string result);

[DllExport("fooAsync", CallingConvention = CallingConvention.StdCall)]
public static void FooAsync([MarshalAs(UnmanagedType.LPWStr)] string bar, FooResultCallback callback)
{
    // 异步执行逻辑,完成后调用回调返回结果
    _ = Task.Run(async () =>
    {
        string result = await _httpClient.GetSomethingAndReturnString(bar);
        callback(result);
    });
}

二、是否需要C++桥接层?

不需要额外的C++桥接层,直接用非托管导出即可满足需求。仅在以下特殊场景考虑使用C++/CLI中间层:

  • 你的C#类库基于.NET Core/.NET 5+且无法使用NativeAOT
  • 需要处理极复杂的类型转换或非托管交互逻辑

三、核心注意事项

  • 内存管理:C#返回的字符串指针必须通过配套的FreeString方法释放,避免内存泄漏;也可约定由Delphi分配内存、C#写入,但复杂度更高。
  • 调用约定:必须与Delphi端一致,推荐用StdCall(Delphi调用外部DLL时需显式指定stdcall调用约定)。
  • 字符串编码:用UnmanagedType.LPWStr对应Delphi的WideString,避免乱码问题。
  • 部署依赖:确保目标机器安装对应版本的.NET运行时(.NET Framework或.NET Core/.NET 5+)。

内容的提问来源于stack exchange,提问作者Wardzionn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:55:34