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

