我在调用的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属性尝试了两个参数,并且它抛出相同的东西。
答案 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);
我假设Place
和Name
参数是输入参数,在这种情况下,字符串的默认编组就可以了。
您不需要指定ANSI字符集,因为这也是默认值。如果入口点与C#函数同名,则无需命名入口点。您无需指定调用约定,因为stdcall
是默认值。
Recordset
接口位于ADODB名称空间中。
顺便说一下,在你的Delphi函数导入中使用far
是假的。一旦我们离开16位世界,far
关键字就会停止生效。