当前位置: 首页 > 编程语言 > C#

ClarionProcedureDeclaration转C#DLLImport分享

时间:2023-04-10 16:18:12 C#

ClarionProcedureDeclaration转C#DLLImport如何把这个ClarionProcedureDeclaration转C#?它是用C编写的第三方DLL的一部分,没有太多文档。我列出了有效的Clarion方法的原型。在C#中,我不确定用什么类型替换*CString。我试过char[]就像@DanielC建议的那样,但它没有用。我还发现Clarionlong是32位的(感谢@shf301)。Clarion:SendRequestProcedure(*CStringxData,LongDataLen,LongxTimeout),Byte,VirtualC#(我试过了,没用):[DllImport("3RD_PARTY_API.dll")]privatestaticexternlongSendRequest(refstringxData,intDataLen,intxTimeout);当我在C#中调用SendRequest方法时,我从VS2010获得了标准的PInvokeStackImbalance错误检查。我认为这是参数类型的问题,而不是DllImport声明中的CharSet或EntryPoint。我真的只是停留在如何将*CString转换为有效的C#类型上。我找到了答案。我希望我仍然与编写此代码的开发人员一起工作,这样我就可以对他们大喊大叫。他们在API周围放置了一个包装器,以便我列出的带有3个参数的方法可以在没有超时值的情况下调用实际的API。PInvokeStackImbalanceexception来自我添加额外参数的事实。这是实际的Clarion过程以及正确的C#语法:Clarion:SendRequestProcedure(*CStringxData,LongDataLen),Byte,VirtualC#:[DllImport("NOVA_API.dll",EntryPoint="SendRequest")]privatestaticexternbyteSendRequest(字符串xData,intDataLen);简而言之,Clarion*CString可以在DLLImport声明中转换为.NET字符串类型。非常感谢那些回应的人。这是我在搜索中使用的另一个资源,我发现它非常有用:pinvoke.net在C#中,longs总是64位。Clarion中的Long是32位。将p/Invoke声明中的long参数更改为int。根据维基百科,clarion可以使用一些奇怪的TopSpeed“双快速调用”,他们使用4个reg参数而不是两个。如果您的代码是使用此调用约定编译的,则无法直接从C#调用它。TopSpeed/Clarion/JPI前四个整数参数在寄存器eax、ebx、ecx和edx中传递。浮点参数在浮点堆栈上传递-寄存器st0、st1、st2、st3、st4、st5和st6。结构参数始终在堆栈上传递。寄存器用完后,额外的参数被传递到堆栈上。在ex中返回一个整数值,在edx中返回一个指针,在st0中返回一个浮点类型。如果不是这种情况,可能是您的某个参数大小不正确,或者您将得到AV而不是损坏的堆栈错误。还可以尝试在dllimport上设置调用约定。除了“TOPSPEED”之外,Clarion还支持stdcall和cdecl,但“TOPSPEED”是默认值。下面是有关与vb6和clarion互操作的教程的链接。http://pisoft.ru/verstak/insider/cw_vb.htm你试过char[]吗?我不确定它是否有效,但值得一试。(我发了这个评论但是我没有权限)以上是C#学习教程:将ClarionProcedureDeclaration转换为C#DLL导入所有分享的内容,如果对大家有用需要进一步了解C#学习教程,希望大家多多指教多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: