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

如何从Delphi 7向COM可见的C# .NET DLL传递字符串数组?

在Delphi 7中正确调用C# COM DLL的方法

你遇到的核心问题是C# COM接口里的ref string[]参数,在Delphi中被COM互操作层映射成了OleVariant类型,直接用静态数组传递自然会触发类型不兼容错误。下面给你一步步拆解解决方案:

问题根源

你的C#接口用了InterfaceType(ComInterfaceType.InterfaceIDispatch)(Dispatch接口),这种类型的接口在处理数组参数时,会把C#的string[]封装成OleVariant类型传递。Delphi 7导入类型库后已经正确识别了这个映射,所以函数签名里的keys参数是var OleVariant,而你用静态数组array[0..1] of WideString去匹配,类型自然不匹配。

正确的调用代码

你需要把keys声明为OleVariant,手动构建字符串数组赋值给它后再传递给函数。完整的可运行代码示例如下:

var
  myClassInstance : IMyClass;
  url : WideString;
  keys : OleVariant;
  response : WideString;
begin
  // 创建COM实例:注意这里要对应导入类型库后生成的Co类,比如对应ProgId"MyClass.Lib"的CoMyClass_Lib
  myClassInstance := CoMyClass_Lib.Create;
  url := 'https://10.0.0.2';
  
  // 初始化OleVariant数组:创建包含2个元素的字符串数组
  keys := VarArrayCreate([0, 1], varOleStr);
  keys[0] := 'a';
  keys[1] := 'b';
  
  // 调用函数
  response := myClassInstance.MyFunc(url, keys);
  
  // 如果C#函数会修改keys数组(因为是ref参数),调用后可以直接读取更新后的值
  // ShowMessage('修改后的第一个key:' + keys[0]);
end;

额外注意事项

  • 确认COM实例的创建方式:Delphi导入类型库后,会自动生成一个CoXXX类(比如你的ProgId是MyClass.Lib,生成的类应该是CoMyClass_Lib),用这个类的Create方法来实例化对象。
  • 因为是ref参数,如果你的C#函数会修改传入的数组内容,调用完成后keys这个Variant里的内容会同步更新,直接通过索引就能读取修改后的值。
  • Delphi的接口类型会自动管理COM对象的引用计数,不需要手动释放,但如果是手动创建的非接口类型对象,记得及时释放资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:39