我正在尝试从 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 代码的源代码。