日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 调用c库dll ,char*转string的解决办法

發(fā)布時(shí)間:2023/12/18 C# 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 调用c库dll ,char*转string的解决办法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近由于有個(gè)未知的設(shè)備需要用到modbus通訊協(xié)議,底層需要與PLC通訊,坤跌,PLC啥型號(hào)也不清楚封在里面不能拆,前人只留了幾個(gè)不能運(yùn)行的QT代碼以及不完整的文檔。用慣了C#想要重新學(xué)QT,真不知猴年馬月能完成項(xiàng)目。于是乎找了一個(gè)開源的基于C語言開發(fā)的modbus庫,擼起袖子干了起來。擼代碼的過程中,遇到調(diào)用c 庫的char*轉(zhuǎn)c#的string多次不成功的情況,各種冒框啊,折騰了大半天才算解決,最終記錄如下,以備后面遇到同樣的坑能少走點(diǎn)彎路。

.h file

#pragma once
#define LineMaxLen 2048 ?
#define KeyMaxLen 128 ?
#define MaxFileLength 1024*10 ?
#if defined(_MSC_VER)
# if defined(DLLBUILD)
/* define DLLBUILD when building the DLL */
# ?define MODBUS_API __declspec(dllexport)
# else
# ?define MODBUS_API __declspec(dllimport)
# endif
#else
# define MODBUS_API
#endif
?
static char value[KeyMaxLen];//需要定義為全局變量,編譯成dll后才能被c#正常調(diào)用,否則指針地址有數(shù)據(jù),指針內(nèi)容看到的返回值為空
?
MODBUS_API char* getValue();
MODBUS_API int sum(int a, int b);
?
#endif ?
.c file

char* getValue()//char key[KeyMaxLen]
{?? ??? ??? ?
?? ?memset(value, 0, sizeof(value));
?? ?strcpy(value, "abcdefgh");
?? ?return ?value;
}
.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
?
namespace RotPlatformControl_CsDll
{
? ? public class CRotPlatformControl
? ? {
? ? ? ? [DllImport("modbus.dll", EntryPoint = "getValue", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
? ? ? ? public static extern IntPtr getValue();//不能用string,使用IntPtr對(duì)應(yīng)于c中的函數(shù)返回類型char*
? ? ? ??
? ? }
}
private void buttonHome_Click(object sender, EventArgs e)
????????{ ??????????
????????????IntPtr temp = CRotPlatformControl.getValue();
????????????res=Marshal.PtrToStringAnsi(temp).ToString();
????????????temp = IntPtr.Zero;
?
????????????lblMessage.Text = res.ToString();
????????}
UI顯示“abcdefgh” 說明dll已經(jīng)調(diào)用成功。


總結(jié):

1. const char* 直接換成string

2. char*做形參或返回值,需要換成IntPtr

3. char*做形參并想要獲取char*內(nèi)容,使用ref IntPtr無用。只能將該char*改為返回值獲得。

4. C庫文件中需要定義為全局變量,編譯成dll后才能被c#正常調(diào)用,否則指針地址有數(shù)據(jù),指針內(nèi)容看到的返回值為空。

modbus封庫源碼

https://download.csdn.net/download/ericwuhk/10352801
?

總結(jié)

以上是生活随笔為你收集整理的c# 调用c库dll ,char*转string的解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。