Delphi方法签名转换为c#

时间:2011-05-23 17:27:04

标签: c# delphi delphi-2007

我在调用的delphi 2007函数中有这个签名(SomeOtherFile是另一个DLL,它反过来调用):

function MyFunction(Place, Name: PChar):_Recordset; stdcall; far; external 'SomeOtherFile.DLL';

我试图用这样的C#代码来调用它:

[DllImport("MyFile.dll", CallingConvention = CallingConvention.StdCall,
    CharSet = CharSet.Ansi, EntryPoint="MyFunction")]

public static extern DataSet MyFunction(string Place, [MarshalAs(UnmanagedType.LPStr)]string Name);

每当我运行它并将其存储到变量中时,我会收到有关类型不匹配的运行时错误。我想我正在阅读签名错误,但我无法弄清楚它应该是什么。

修改的 实际的错误是:对PInvoke函数的调用[...]使堆栈失去平衡......我也使用MarshalAs属性尝试了两个参数,并且它抛出相同的东西。

1 个答案:

答案 0 :(得分:0)

我已经做了一些挖掘,我认为你需要将返回值编组为Recordset接口。我确信P / Invoke编组器不会将您的Delphi _Recordset神奇地转换为.net DataSet类实例。

所以我认为你可以这样写:

[DllImport("MyFile.dll")]
[return: MarshalAs(UnmanagedType.Interface)]
public static extern object MyFunction(string Place, string Name);

像这样称呼

Recordset rs = (Recordset) MyFunction(Place, Name);

我假设PlaceName参数是输入参数,在这种情况下,字符串的默认编组就可以了。

您不需要指定ANSI字符集,因为这也是默认值。如果入口点与C#函数同名,则无需命名入口点。您无需指定调用约定,因为stdcall是默认值。

Recordset接口位于ADODB名称空间中。

顺便说一下,在你的Delphi函数导入中使用far是假的。一旦我们离开16位世界,far关键字就会停止生效。

相关问题