C#中DllImport的作用是什么

C# 中DllImport的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)專注于稷山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供稷山營銷型網(wǎng)站建設(shè),稷山網(wǎng)站制作、稷山網(wǎng)頁設(shè)計、稷山網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造稷山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供稷山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

MSDN中對DllImport Attribute的解釋是這樣的:可將該屬性應(yīng)用于方法。DllImport Attribute 屬性提供對從非托管 DLL 導(dǎo)出的函數(shù)進(jìn)行調(diào)用所必需的信息。作為***要求,必須提供包含入口點(diǎn)的 DLL 的名稱。

并給了一個示例:

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,   CharSet=CharSet.Unicode, ExactSpelling=true,   CallingConvention=CallingConvention.StdCall)]   public static extern bool MoveFile(String src, String dst);

上網(wǎng)搜了一下,最常見的就是使用它來調(diào)用WIN32的API,例如上面所示?;蛘哒{(diào)用一下C或C++編寫的DLL。

這東西沒怎么用過。只是前幾天忽然分配下一個臨時的任務(wù),做一個“停車廠管理”的小東西,聽說是一個大干部的小孩子要弄這么個東西,那干部是公司的客戶,討論正經(jīng)事之余又拜托了我們做這么個小東西。其中用到了單片機(jī)模擬車輛出入的一些信號。

我對單片機(jī)一竅不通,好在有人寫好了輪詢單片機(jī)的DLL,我只管調(diào)用,由于是C++寫的,于是將DLL拷貝到BIN目錄后(這DLLImport會從程序啟動目錄開始查找相應(yīng)名稱的DLL,未找到則轉(zhuǎn)至system32下查找),用DllImport來調(diào)用,但在這個過程中遇到了幾個問題:

1.看了一下C++的代碼,需要用到的只有三個方法:

bool OpenSerialPort1()   bool fnGetIO(unsigned char& P1, unsigned char& P2, unsigned char& P3)   bool CloseSerialPort1()

于是就在自己的程序中寫了:

using System.Runtime.InteropServices;   ……   [DllImport("GetIODll.dll", EntryPoint = "OpenSerialPort1")]   public static extern bool OpenSerialPort1();   [DllImport("GetIODll.dll", EntryPoint = "fnGetIO")]   public static extern bool fnGetIO(ref byte P1, ref byte P2, ref byte P3);   [DllImport("GetIODll.dll", EntryPoint = "CloseSerialPort1")]   public static extern bool CloseSerialPort1();

然而程序在運(yùn)行時無論如何總是提示“找不到入口點(diǎn)”,搞得懵了,只好上網(wǎng)搜去,***下了一個叫eXeScope的小軟件,裝完之后查看該DLL,果然如貼子中寫的,DLL中的函數(shù)名稱發(fā)生了變化,分別成了:

?OpenSerialPort1@@YA_NXZ

?fnGetIO@@YA_NAAE00@Z

?CloseSerialPort1@@YA_NXZ

將這些怪怪的名稱代入到EntryPoin中,編譯運(yùn)行,沒有問題了。

2.可是接上單片機(jī)之后,問題又來了,雖然OpenSerialPort1返回的結(jié)果是true,但fnGetIO讀出一數(shù)據(jù)全是0,按理應(yīng)該是全1才對。來了一個同事,說反正有源碼,把原來的DLL弄成標(biāo)準(zhǔn)C的試試,標(biāo)準(zhǔn)C不標(biāo)準(zhǔn)C的我也沒明白,讓那人給改了一下,把編譯之后的DLL拷到自己程序的BIN下,將EntryPoin換成正常的函數(shù)名,運(yùn)行,這回是真的OK了。

讀寫.ini文件時,也會用到C# DllImport,不過現(xiàn)在.ini文件好像用得少了,下面是讀寫的程序:

{   publicstring path;   [DllImport("kernel32")]   privatestaticexternlong WritePrivateProfileString(string section,string key,string val,string filePath);   [DllImport("kernel32")]   privatestaticexternint GetPrivateProfileString(string section,string key,string def,StringBuilder   retVal,int size,string filePath);   public IniFile(string INIPath)   {          path = INIPath;   }   publicvoid IniWriteValue(string Section,string Key,string Value)   {          WritePrivateProfileString(Section,Key,Value,this.path);   }   publicstring IniReadValue(string Section,string Key)   {          StringBuilder temp = new StringBuilder(255);          int i = GetPrivateProfileString(Section,Key,"",temp,255,this.path);          return temp.ToString();   }   }

網(wǎng)上關(guān)于C# DllImport的很多問題是由于所調(diào)方法的參數(shù)比較復(fù)雜,現(xiàn)在我還沒用到,看到一篇貼子,參數(shù)中帶指針的,也先錄下來,以備將來查用:

參數(shù)是用指針來獲取一個數(shù)組:Int GetData(byte * pBuffer) 

pBuffer是數(shù)組的首地址,也就是說GetData會寫pBuffer[0],pBuffer[1]....pBuffer[100];

答曰:

[DllImport("yourDllFile.dll"]     Private static extern int GetValue([MarshalAs(UnmanagedType.LPArray)]byte[] pValue);

如果是out參數(shù),可以如下 

[DllImport("yourDllFile.dll")]   Private static extern int GetValue([Out,MarshalAs(UnmanagedType.LPArray)]byte[] pValue);

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

分享文章:C#中DllImport的作用是什么
標(biāo)題URL:http://muchs.cn/article10/ihspgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、商城網(wǎng)站網(wǎng)站設(shè)計公司、服務(wù)器托管全網(wǎng)營銷推廣、搜索引擎優(yōu)化

廣告

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

營銷型網(wǎng)站建設(shè)