我有我打电话德尔福2007功能此签名(该SomeOtherFile是,它依次调用另一个DLL):我想叫它德尔菲法签名转换成C#
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的函数调用[...]已不平衡堆栈...我也尝试都PARAMS使用MarshalAs特性,并且它抛出同样的事情。
“类型不匹配”通常是编译时错误,而不是运行时错误。您能否引用错误文本并告诉我们您得到的错误的类名?另外,是什么让你认为第二个参数需要特别编组,但第一个不需要? “MyFunction”对这些指针有什么作用? (它写入缓冲区,还是只读取它们?)最后,什么是DataSet和_Recordset? – 2011-05-23 18:13:56
很难看到P/Invoke编组匹配'_Recordset'和'DataSet'!你也不需要'MarshalAs'属性,但这是一个细微之处。 – 2011-05-23 18:18:44
@Dan为什么你在'Name'参数中使用'MarshalAs'而不是在'Place'中,如果两个参数都是相同的类型? – RRUZ 2011-05-23 18:49:04