麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

關于C#中的DLLImport

2019-11-18 16:53:46
字體:
來源:轉載
供稿:網友

MSDN中對DllImportAttribute的解釋是這樣的:可將該屬性應用于方法。DllImportAttribute 屬性提供對從非托管 DLL 導出的函數進行調用所必需的信息。作為最低要求,必須提供包含入口點的 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);

 

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

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

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

 

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();

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

?OpenSerialPort1@@YA_NXZ

?fnGetIO@@YA_NAAE00@Z

?CloseSerialPort1@@YA_NXZ

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

 

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

 

讀寫.ini文件時,也會用到DllImport,不過現在.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();

}

}

 

網上關于DllImport的很多問題是由于所調方法的參數比較復雜,現在我還沒用到,看到一篇貼子,參數中帶指針的,也先錄下來,以備將來查用:

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

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

答曰:

[DllImport("yourDllFile.dll"]  

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

 

如果是out參數,可以如下  

[DllImport("yourDllFile.dll")]  

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: qyl在线视频精品免费观看 | 久久经典国产视频 | 91精品免费在线 | 久久久久免费精品 | 久久精品亚洲欧美日韩精品中文字幕 | 亚洲午夜精选 | 狠狠干夜夜操 | 成熟女人特级毛片www免费 | 深夜网站在线观看 | 久久国产精品二国产精品中国洋人 | 精品免费久久 | 草莓福利视频在线观看 | 亚洲一区二区三区日本久久九 | 色综合网在线观看 | 欧美一级三级在线观看 | 日本视频网 | 亚洲视频在线网 | 成人男女啪啪免费观看网站四虎 | 国产一区网址 | 国产一级在线免费观看 | a免费视频 | 国产wwww | 国产精品免费观看视频 | 毛片网站网址 | 午夜精品福利影院 | 鲁人人人鲁人人鲁精品 | av电影在线观看网站 | 99精品视频在线观看免费播放 | 精品一区二区久久久久久按摩 | 特级西西444www大精品视频免费看 | 少妇色诱麻豆色哟哟 | 成人做爽爽爽爽免费国产软件 | 成人aaaaa片毛片按摩 | 欧美精品成人一区二区在线观看 | 精品一区二区三区免费毛片 | 热久久成人 | 美女被免费网站在线软件 | 欧美1区2区| 在线99热| 狠狠干导航 | 国产亚洲精品久久久久婷婷瑜伽 |