国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于C#中的DLLImport

2019-11-18 16:53:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

并給了一個(gè)示例:

[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)搜了一下,最常見(jiàn)的就是使用它來(lái)調(diào)用WIN32的API,例如上面所示。或者調(diào)用一下C或C++編寫(xiě)的DLL。

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

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

 

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

bool OpenSerialPort1()

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

bool CloseSerialPort1()

于是就在自己的程序中寫(xiě)了:

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)行時(shí)無(wú)論如何總是提示“找不到入口點(diǎn)”,搞得懵了,只好上網(wǎng)搜去,最后下了一個(gè)叫eXeScope的小軟件,裝完之后查看該DLL,果然如貼子中寫(xiě)的,DLL中的函數(shù)名稱發(fā)生了變化,分別成了:

?OpenSerialPort1@@YA_NXZ

?fnGetIO@@YA_NAAE00@Z

?CloseSerialPort1@@YA_NXZ

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

 

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

 

讀寫(xiě).ini文件時(shí),也會(huì)用到DllImport,不過(guò)現(xiàn)在.ini文件好像用得少了,下面是讀寫(xiě)的程序:

{

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)于DllImport的很多問(wèn)題是由于所調(diào)方法的參數(shù)比較復(fù)雜,現(xiàn)在我還沒(méi)用到,看到一篇貼子,參數(shù)中帶指針的,也先錄下來(lái),以備將來(lái)查用:

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

pBuffer是數(shù)組的首地址,也就是說(shuō)GetData會(huì)寫(xiě)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);

http://www.survivalescaperooms.com/KissKnife/archive/2006/11/04/549990.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥宁县| 崇左市| 穆棱市| 莆田市| 治县。| 清涧县| 安福县| 洛隆县| 大宁县| 莲花县| 佳木斯市| 白山市| 西和县| 昌邑市| 城步| 漳州市| 潜江市| 瓦房店市| 葫芦岛市| 象山县| 上虞市| 恩平市| 浙江省| 体育| 宣武区| 西宁市| 苍南县| 洛阳市| 呼和浩特市| 漯河市| 马关县| 通州区| 时尚| 保山市| 紫阳县| 永德县| 巨野县| 邯郸市| 濮阳县| 宣威市| 安泽县|