在 C# 中使用“const char*”和“const int”编组我的 C++ .dll
Posted
技术标签:
【中文标题】在 C# 中使用“const char*”和“const int”编组我的 C++ .dll【英文标题】:Marshalling my C++ .dll in C# with "const char*" and "const int" 【发布时间】:2016-05-26 10:35:20 【问题描述】:使用 C++:
extern "C" MY_API int connect(const char* pcHost,const int nPort, ConnectionId_T *pConId);
存在:
pcHost
一个IP
nPort
一个端口
pConId
一个常数 (-1)
我的尝试是:
[DllImport("my.dll", CharSet = CharSet.Ansi)]
public static extern int connect(StringBuilder pcHost, int nPort, ConnectionId_T pConId);
但是当我尝试连接时:
StringBuilder ip = new System.Text.StringBuilder();
ip.Append("1.1.1.1");
int nPort = 1111;
ConnectionId_T nConId = MY_NCONID // This is defined previously as -1 (public const int MY_NCONID = -1)
connect(ip, nPort, nConId))
我在 connect
行收到 AccesViolationException。我的元帅错了吗?
PS:ConectionId_T
定义为using ConnectionId_T = System.Int32;
提前致谢。
【问题讨论】:
***.com/questions/30028593/const-char-in-c @codroipo 我也试过[MarshalAs(UnmanagedType.LPStr)]
,我得到了同样的错误。
您还必须将属性添加到您的方法定义[DllImport("yourdll.dll", CharSet = CharSet.Ansi)]
@MujahidDaudKhan 这已包含在原始帖子中。
【参考方案1】:
PS: ConectionId_T is defined as using ConnectionId_T = System.Int32;
基于此,如果我假设 ConnectionId_T
在 C++ 世界中只不过是 int
,那么您需要将函数导入更改为:
[DllImport("my.dll", CharSet = CharSet.Ansi)]
public static extern int connect(StringBuilder pcHost, int nPort, IntPtr pConId);
或如:
[DllImport("my.dll", CharSet = CharSet.Ansi)]
public static extern int connect(StringBuilder pcHost, int nPort, ref int pConId);
【讨论】:
【参考方案2】:[DllImport("my.dll", CharSet = CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)]
public static extern int connect(IntPtr pcHost, int nPort, ref ConnectionId_T pConId);
并使用Intptr pcHost = Marshal.StringToHGlobalAnsi(pcHostString))
【讨论】:
pConId
原来是int
,为什么要改成int
?
有什么不同吗?
如何将 IP 字符串转换为 IntPtr
以便使其工作?
通过上述方法调用Marshal.StringToHGlobalAnsi(string s)
它通过在pConId
之前添加out
起作用,因为.dll
返回该变量的值。谢谢!以上是关于在 C# 中使用“const char*”和“const int”编组我的 C++ .dll的主要内容,如果未能解决你的问题,请参考以下文章
const char []和const char之间的区别*
如何使用 UTF-8 字符序列在 C++ 中初始化 const char* 和/或 const std::string?
char * 和 const char * 之间的转换 [关闭]