将Clarion过程声明转换为C#DLLImport

Dan*_*nM7 2 c# pinvoke clarion

如何将此Clarion过程声明转换为C#?它是用C编写的第三方DLL的一部分,没有太多的文档。我已经在Clarion中列出了可以正常工作的方法的原型。在C#中,我不确定要使用哪种类型来替换*CString。我尝试char[]像@DanielC建议的那样,但是没有用。我还发现Clarion long是32位的(感谢@ shf301)。

号角:

SendRequest Procedure(*CString xData,Long DataLen,Long xTimeout),Byte,Virtual
Run Code Online (Sandbox Code Playgroud)

C#(我尝试过的方法不起作用):

[DllImport("3RD_PARTY_API.dll")]
private static extern long SendRequest(ref string xData, int DataLen, int xTimeout);
Run Code Online (Sandbox Code Playgroud)

当我SendRequest在C#中调用该方法时,我从VS2010 获取标准的PInvokeStackImbalance被检测到错误。我认为它的参数类型的问题,而不是像CharSetEntryPoint的DllImport声明。我真的只是停留在如何转换*CString为有效的C#类型上。

Dan*_*nM7 5

我找到了答案。我希望我仍然与编写此代码的开发人员一起工作,以便对他们大喊大叫。他们在API周围包装了一层包装,这样我列出的带有3个参数的方法便可以调用没有超时值的实际API。PInvokeStackImbalance异常来自于我添加了一个额外参数的事实。

这是实际的Clarion过程以及与此相关的正确C#语法:

号角:

SendRequest Procedure(*CString xData, Long DataLen), Byte, Virtual
Run Code Online (Sandbox Code Playgroud)

C#:

[DllImport("NOVA_API.dll", EntryPoint = "SendRequest")]
private static extern byte SendRequest(string xData, int DataLen);
Run Code Online (Sandbox Code Playgroud)

总之,*CString可以string在DLLImport声明中将Clarion 转换为.NET 类型。

非常感谢那些回答。这是我在搜索中使用的其他资源,发现非常有用:pinvoke.net