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
相关产品推荐
相关产品推荐

