【问题标题】:Import C++ Dll in c# [closed]在 C# 中导入 C++ Dll [关闭]
【发布时间】:2014-07-10 12:31:35
【问题描述】:

有一个用C++写的库,你必须把它导入到项目中到C# 遇到这样的问题 我无法将代码翻译成 C# 函数

short L862_GetResponse ( short hPort, short *Len, char * pData, long Timeout );

短 *Len, char * pData 不可能把这些变量翻译成C#

【问题讨论】:

  • 我不明白如何呈现这部分:short *Len, char * pData
  • 通常是用C++写的(不带空格)。
  • 您是在尝试链接到 C++ 库,还是在 C# 中重写 C++ 函数?
  • 通过 Dllimport 分配

标签: c# c++ dll dllimport


【解决方案1】:
short L862_GetResponse(short hPort, short *Len, char *pData, long Timeout);

严格来说,我们需要比这更多的信息。例如,short* 可以是一个数组,也可以是一个标量的地址。 pData 背后的协议是什么。调用者是否分配了一个长度通过Len 传递的缓冲区?参数语义是 in、out 还是 in/out?只有你阅读文档才能知道。

我会猜几个。我假设*Len 具有入口时缓冲区的长度,并且该函数修改*Len 以包含写入缓冲区的字符数。

p/invoke 看起来像这样:

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
public static extern short L862_GetResponse(
    short hPort, 
    ref short Len, 
    [In, Out]
    byte[] Data, 
    int Timeout
);

然后你会像这样调用函数:

short Len = 256; // or some other size
byte[] Data = new byte[Len];
short retval = L862_GetResponse(hPort, ref Len, Data, Timeout);
if (retval != 0) // assume that 0 means success
    ... handle error
string str = Encoding.UTF8.GetString(byte, 0, Len);

我假设Data 包含一个编码为 UTF-8 的字节数组。并且 Len 不包含空终止符。

我在这里做了很多假设,因为问题中的信息不完整。请期待我的假设是错误的。请查看该函数的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2016-05-23
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多