中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

基于C#如何調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)基于C#如何調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)是一家專業(yè)提供榆陽企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、html5、小程序制作等業(yè)務(wù)。10年已為榆陽眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。

C#調(diào)用c++dll文件是一件很麻煩的事情,首先面臨的是數(shù)據(jù)類型轉(zhuǎn)換的問題,相信經(jīng)常做c#開發(fā)的都和我一樣把學(xué)校的那點c++底子都忘光了吧(語言特性類)。

網(wǎng)上有一大堆得轉(zhuǎn)換對應(yīng)表,也有一大堆的轉(zhuǎn)換實例,但是都沒有強調(diào)一個更重要的問題,就是c#數(shù)據(jù)類型和c++數(shù)據(jù)類型占內(nèi)存長度的對應(yīng)關(guān)系。

如果dll文件中只包含一些基礎(chǔ)類型,那這個問題可能可以被忽略,但是如果是組合類型(這個叫法也許不妥),如結(jié)構(gòu)體、類類型等,在其中的成員變量的長度的申明正確與否將決定你對dll文件調(diào)用的成敗。

如有以下代碼,其實不是dll文件的源碼,而是廠商給的c++例子代碼

c++中的結(jié)構(gòu)體申明

typedef struct 
{ 
 unsigned char Port; 
 unsigned long Id; 
 unsigned char Ctrl; 
 unsigned char pData[8]; 
}HSCAN_MSG;

c++中的函數(shù)申明(一個c++程序引用另一個c++的dll文件)

extern "C" int _stdcall HSCAN_SendCANMessage(unsigned char nDevice,unsigned char nPort,HSCAN_MSG *msg,int nLength);

c++中的調(diào)用:

.... 
HSCAN_MSG msg[100]; 
..... 
HSCAN_SendCANMessage(m_nDevice,m_nPort,msg,nFrames);

由上述代碼可見,msg是個結(jié)構(gòu)體的數(shù)組。

下面是我的c#的代碼

c#結(jié)構(gòu)體申明:(申明成)

[StructLayout(LayoutKind.Sequential)] 
 public struct HSCAN_MSG 
 { 
    // UnmanagedType.ByValArray, [MarshalAs(UnmanagedType.U1)]這個非常重要,就是申明對應(yīng)類型和長度的 
 [MarshalAs(UnmanagedType.U1)] 
 public byte Port; 
 [MarshalAs(UnmanagedType.U4)] 
 public uint nId; 
 [MarshalAs(UnmanagedType.U1)] 
 public byte nCtrl; 
 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
 public byte[] pData; 
 };

c#函數(shù)申明

[DllImport("HS2106API.dll")] 
 public static extern int HSCAN_SendCANMessage( 
 byte nDevice, byte nPort, HSCAN_MSG[] pMsg, int nLength);

C#函數(shù)調(diào)用

HSCAN_MSG[] msg = new HSCAN_MSG[1]; //發(fā)送緩沖區(qū)大小可根據(jù)需要設(shè)置; 
 for (int yy = 0; yy < msg.Length; yy++) 
 { 
 msg[yy] = new HSCAN_MSG(); 
 } 
    //...結(jié)構(gòu)體中的成員的實例化略 
    HSCAN_SendCANMessage(0x0, 0x0, msg, 1)

那些只能用指針不能用結(jié)構(gòu)體和類的地方

c++中的結(jié)構(gòu)體申明

typedef struct 
{ 
 unsigned char Port; 
 unsigned long Id; 
 unsigned char Ctrl; 
 unsigned char pData[8]; 
}HSCAN_MSG;

c++中的函數(shù)申明(一個c++程序引用另一個c++的dll文件)

extern "C" int _stdcall HSCAN_SendCANMessage(unsigned char nDevice,unsigned char nPort,HSCAN_MSG *msg,int nLength);

c#中的結(jié)構(gòu)體申明:

[StructLayout(LayoutKind.Sequential)] 
 public struct HSCAN_MSG 
 { 
 [MarshalAs(UnmanagedType.U1)] 
 public byte Port; 
 /// <summary> 
 /// 節(jié)點標(biāo)識,nEFF=1 時(擴展幀),為29 位nEFF=0(標(biāo)準(zhǔn)幀)時,為11 位; 
 /// </summary> 
 [MarshalAs(UnmanagedType.U4)] 
 public uint nId; 
 [MarshalAs(UnmanagedType.U1)] 
 public byte nCtrl; 
 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
 public byte[] pData; 
 };

c#函數(shù)的調(diào)用:包含使用指針I(yè)ntPtr替代結(jié)構(gòu)體數(shù)組和讀取IntPtr的方法

HSCAN_MSG[] msg1 = new HSCAN_MSG[10]; 
 for (int i = 0; i < msg1.Length; i++) 
 { 
 msg1[i] = new HSCAN_MSG(); 
 msg1[i].pData = new byte[8]; 
 } 
 IntPtr[] ptArray = new IntPtr[1]; 
 ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(HSCAN_MSG)) * 10); 
 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(HSCAN_MSG))); 
 Marshal.Copy(ptArray, 0, pt, 1); 
 
 int count = HSCAN_ReadCANMessage(0x0, 0,pt, 10); 
 
 textBoxStatus.Text += "/r/n" + "讀取0口:" + count.ToString() + "幀數(shù)據(jù)"; 
 for (int j = 0; j < 10; j++) 
 { 
 msg1[j] = 
 (HSCAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt+ j * Marshal.SizeOf(typeof(HSCAN_MSG))) 
 , typeof(HSCAN_MSG)); 
 textBoxStatus.Text += "/r/n收到0口" + Convert.ToByte(msg1[j].pData[0]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[1]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[2]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[3]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[4]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[5]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[6]).ToString() 
 + "|" + Convert.ToByte(msg1[j].pData[7]).ToString(); 
 }

感謝各位的閱讀!關(guān)于“基于C#如何調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁標(biāo)題:基于C#如何調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針-創(chuàng)新互聯(lián)
分享URL:http://www.rwnh.cn/article6/doegog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、網(wǎng)站設(shè)計公司、網(wǎng)站設(shè)計靜態(tài)網(wǎng)站、外貿(mào)建站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
九龙县| 裕民县| 东乌珠穆沁旗| 翁源县| 海阳市| 宝坻区| 大洼县| 隆回县| 阜新| 双桥区| 镇赉县| 龙门县| 临泉县| 盐津县| 石狮市| 新泰市| 紫云| 辽源市| 杨浦区| 砀山县| 远安县| 海丰县| 建平县| 闸北区| 乌鲁木齐市| 绥中县| 铁力市| 岳阳市| 彰武县| 太谷县| 黄山市| 永德县| 西峡县| 福海县| 镇平县| 察雅县| 秦安县| 奉贤区| 秦安县| 依安县| 安徽省|