1

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

4

0 回答 0