我有一个Delphi DLL,其函数定义为:
function SubmitJobStringList(joblist:tStringList; var jobno:Integer):Integer;
我是用C#来称呼的.如何将第一个参数声明为C#中不存在tStringList.我目前的声明如下:
[DllImport("opt7bja.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int SubmitJobStringList(string[] tStringList, ref int jobno);
但是当我调用它时,我得到了内存访问冲突异常.
任何人都知道如何从C#正确传递给tStringList?
你很可能没有运气.TStringList不仅仅是一个数组,它是一个完整的类,确切的实现细节可能与.NET不同.看看Delphi VCL源代码(也就是说,如果你有的话)并试着找出你是否可以用C#重建类,并在最好的朋友Interop Marshaller的帮助下传递它.请注意,即使Delphi字符串类型与.NET字符串类型不同,并且传递它而不告诉编组器他应该做什么,他很可能将它作为char数组传递.
除此之外,我建议更改Delphi DLL.在非Delphi客户端使用的DLL中暴露特定于Delphi的东西永远不是一件好事.使参数成为PChar的数组,你应该没问题.