如何将这个Clarion过程声明转换为C#?它是用C编写的第三方DLL的一部分,它没有太多的文档。我已经在Clarion中列出了该方法的原型,它工作正常。在C#中,我不确定用什么类型来替换*CString。我按照@DanielC的建议尝试了char[],但它不起作用。我还发现Clarion long是32位的(感谢@shf301)。
Clarion:
SendRequest Procedure(*CString xData,Long DataLen,Long xTimeout),Byte,VirtualC# (我已经尝试过了,但不起作用):
[DllImport("3RD_PARTY_API.dll")]
private static extern long SendRequest(ref string xData, int DataLen, int xTimeout);当我在C#中调用SendRequest方法时,从VS2010得到标准的PInvokeStackImbalance was detected错误。我认为这是参数类型的问题,而不是DllImport declaration中的CharSet或EntryPoint。我真的被困在如何将*CString转换成有效的C#类型上了。
发布于 2012-10-31 01:53:02
我找到了答案。我希望我仍然和写这段代码的开发人员一起工作,这样我就可以对他们大喊大叫了。他们对API进行了包装,这样我列出的带有3个参数的方法就可以在没有超时值的情况下调用实际的API。PInvokeStackImbalance异常来自于我添加了一个额外的参数。
下面是实际的Clarion过程以及正确的C#语法:
Clarion:
SendRequest Procedure(*CString xData, Long DataLen), Byte, VirtualC#:
[DllImport("NOVA_API.dll", EntryPoint = "SendRequest")]
private static extern byte SendRequest(string xData, int DataLen);总之,Clarion *CString可以在.NET声明中转换为DLLImport string类型。
非常感谢那些回应的人。这是我在搜索中使用的另一个资源,我发现它非常有用:pinvoke.net
发布于 2012-10-30 07:35:23
在C#中,long始终是64位。Clarion中的Long是32位。将p/Invoke声明中的long参数更改为int的。
发布于 2012-10-30 19:27:24
根据维基百科的说法,clarion可以使用一些奇怪的TopSpeed“双快速调用”,他们使用4个reg而不是2个参数。如果使用此调用约定编译代码,则不可能直接从C#调用。
TopSpeed / Clarion / JPI前四个整数参数在寄存器eax、ebx、ecx和edx中传递。浮点参数在浮点堆栈寄存器st0、st1、st2、st3、st4、st5和st6上传递。结构参数总是在堆栈上传递。其他参数在寄存器耗尽后传递到堆栈上。整数值在eax中返回,指针在edx中返回,浮点类型在st0中返回。
如果不是这样,那么可能你的一个参数的大小不正确,否则你会得到一个AV而不是corrupt stack错误。
也可以尝试在dllimport上设置调用约定。除了"TOPSPEED“clarion还支持stdcall和cdecl,但"TOPSPEED”是默认的。下面是一个关于vb6和clarion互操作教程的链接。
http://pisoft.ru/verstak/insider/cw_vb.htm
https://stackoverflow.com/questions/13130365
复制相似问题