我试图用C#调用Delphi开发的外部提供的DLL。但是,在尝试传递Delphi类型“指针”的参数时调用函数时,似乎总是会出现堆栈不平衡错误。
以下是DLL开发人员提供的定义:
procedure SetSeparator( const aIsEuropean: Pointer ); stdcall;
external 'DLLName.dll';
我在C#中的前瞻声明是:
[DllImport(EXPERT_RT_NAME, EntryPoint = "SetSeparator",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void SetSeparator(string strSeparator);
在C#中调用此代码的代码是:
string s = "1";
SetSeparator(s);
调用时,收到的错误是:
对PInvoke函数':: SetSeparator'的调用使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
指定了调用约定,所以我很确定没问题。我认为参数是问题吗?
我尝试使用IntPtr更改PInvoke编组,并更改参数周围的各种选项。还有另一个(无参数)调用似乎有效(但直到我可以用这个和其他几个类似的调用来初始化DLL,我无法确定)。
另外,我有一些调用,我需要传递指针以便接收信息。
希望有人可以提供帮助,因为我已经花费了大量时间来重新解决这个问题,尽管我可以看到所有相关的内容并且没有选择。
遗憾的是,我无法访问Delphi代码的源代码。