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

Delphi使用JEDI/JCL运行时调用.NET DLL静态方法的方案咨询

基于JEDI/JCL的静态方法调用方案

你之前使用的CreateInstance是针对可实例化的非静态类设计的,静态类无法实例化,直接通过_AppDomain接口的InvokeMember方法即可调用静态方法,完全不需要生成TLB、注册COM组件,仅需将.NET DLL放在程序同级目录即可。

完整调用代码示例:

procedure TForm1.Button2Click(Sender: TObject);
var
  Host: TJclClrHost;
  ResultStr: string;
  Params: OleVariant;
begin
  Host := TJclClrHost.Create('v4.0.30319');
  Host.Start();
  try
    // 构造参数数组,按顺序传入静态方法的入参
    Params := VarArrayOf(['你要传入的param参数值']);
    // 直接调用静态方法
    ResultStr := Host.DefaultAppDomain.InvokeMember(
      'DLLSTATIC.SOMESUBNAME.staticclass', // 完整类名(命名空间+类名)
      280, // BindingFlags组合:Public | Static | InvokeMethod,对应十进制值280
      Null, // 绑定器,传空即可
      Null, // 目标实例,静态方法不需要实例,传空
      Params // 方法参数数组
    );
    // 这里ResultStr就是静态方法的返回值
    ShowMessage(ResultStr);
  finally
    Host.Stop();
    Host.Free;
  end;
end;

注意事项

  • 确保你的.NET DLL的生成平台和Delphi编译的exe平台一致(同是x86或者同是x64)
  • 不需要对.NET DLL做COM注册,你声明的ComVisible特性仅用于运行时反射可见,不需要额外操作

无JCL依赖的轻量替代方案

如果不想依赖JCL库,也可以手动调用CLR原生接口实现静态方法调用,逻辑和上述方案一致,仅需自己实现CLR宿主启动逻辑,不需要引入任何第三方库,也同样满足无TLB、无预引用的要求:
核心实现逻辑:

  • 调用mscoree.dll的CorBindToRuntimeEx接口启动指定版本的CLR运行时
  • 获取默认AppDomain对象
  • 同样调用InvokeMember方法执行静态方法,参数规则和上述JCL方案完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:05