最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# [ImportDll()] 知識(shí)小結(jié)

 更新時(shí)間:2019年01月23日 15:13:37   作者:chenqiangdage  
今天小編就為大家分享一篇關(guān)于C# [ImportDll()] 知識(shí)小結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

這周在做公司的一個(gè)C#項(xiàng)目中,要寫(xiě)一個(gè)webservice提供一個(gè)下載方法,之前公司有過(guò),但是要整改,于是這種鳥(niǎo)屎攤子又交給了我,其中一個(gè)密文流的下載中要應(yīng)用我們小組另一伙人用C++寫(xiě)的四個(gè)dll, 這些DLL是由我們自己編寫(xiě)的,非.NET 托管,這是一個(gè)麻煩事;

如果用 IDE往工程里add reference時(shí),它會(huì)提示這幾個(gè)dll是沒(méi)有注冊(cè)的,不是.NET托管的。好吧,順便補(bǔ)充一下.NET托管和非托管。

具體官方術(shù)語(yǔ)是:

托管DLL就是能夠在公共語(yǔ)言運(yùn)行庫(kù)(Common Language Runtime,簡(jiǎn)稱(chēng)CLR)中能夠直接引用的,并且擴(kuò)展名為“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動(dòng)態(tài)鏈接庫(kù)等,其中就包括了封裝所有Windows API函數(shù)的DLL文件。各種非托管DLL中的函數(shù)在公共語(yǔ)言運(yùn)行庫(kù)中不能直接被調(diào)用,而需要經(jīng)過(guò).Net框架提供的“平臺(tái)調(diào)用”服務(wù)后才可以。

通俗點(diǎn)講就是:

托管Dll就在.NET環(huán)境生成的Dll文件。

非托管dll不是在.NET環(huán)境生成的dll文件。比如說(shuō)用c寫(xiě)的,用C++寫(xiě)的。

托管Dll文件,可以在IDE通過(guò) “add reference” 的方式,直接把托管Dll文件添加到項(xiàng)目中。然后通過(guò) Using  Dll命名空間,來(lái)調(diào)用相應(yīng)的Dll對(duì)象 。非托管Dll文件怎么調(diào)用了,這就要用到 [ImportDll()] 這種方法了;

[ImportDll()] 這種方法是通過(guò)P/Iovoke 來(lái)調(diào)用WIN32 API。其作用是導(dǎo)入外部的函數(shù),這些函數(shù)不是由NET托管的。當(dāng)然當(dāng)使用[ImportDll()] 時(shí),必須要引入命名空間:

using System.Runtime.InteropServices;

舉一個(gè)例子

[DllImport(@("DownloadPlaintext.dll",EntryPoint="DownloadPlaintext"))]
  static extern Boolean FileDownLoad ([MarshalAs(UnmanagedType.LPStr)] StringBuilder pstrSourceFile,
                    [MarshalAs(UnmanagedType.LPStr)] long lintFileSize,
                    bool blnEnFlag)

這個(gè)例子導(dǎo)入的就是一個(gè) C++寫(xiě)的dll,名字是DownloadPlaintext.dll,這樣寫(xiě)的是相對(duì)的路徑,所以我們必須要手動(dòng)的把這個(gè)dll文件拷到該項(xiàng)目的bin目錄下對(duì)應(yīng)的release或者Debug目錄中去。否則就會(huì)找不到dll,或者直接將此dll,丟到system32中去,但這樣做是不安全的;

EntryPoint是外部函數(shù) 的入口點(diǎn),可以理解為調(diào)用外部函數(shù)的那個(gè)方法,假設(shè)dll中存在DownloadPlaintext這個(gè)函數(shù)名,而項(xiàng)目中也存在的話,這樣就會(huì)有沖突,所以C#還提供了重定義外部函數(shù)方法名,(并不是該dll中的名字,只是改變其在這個(gè)項(xiàng)目文件中的使用名而已),就像上面的例子一樣,將DownloadPlaintext方法在C#這個(gè)項(xiàng)目的使用名命名為FileDownLoad ,要注意的是參數(shù)要一致,類(lèi)型要一致;

MarshalAs 是指提供向非托管代碼封裝數(shù)據(jù)時(shí)的規(guī)則,上面告訴net,第一個(gè)參數(shù)要用string 類(lèi)型,第三個(gè)是bool型;

這里要注意一個(gè)問(wèn)題,剛開(kāi)始改代碼時(shí),調(diào)試通過(guò)了,一發(fā)到IIS,其他人根本無(wú)法成功調(diào)用這個(gè)方法,我糾結(jié)了半天,后來(lái)才找到原因!

因?yàn)槭窃谇叭嘶A(chǔ)上改代碼,沒(méi)注意前人留下的坑,這份代碼的初始者,將dll的引入路徑做成的是絕對(duì)路徑:

[DllImport(@("C:\CloudDll\DownloadPlaintext.dll",EntryPoint="DownloadPlaintext"))]

這樣的話,IIS是無(wú)法去找到這個(gè)路徑的,即使你在C:\CloudDll目錄下有這個(gè)dll,所以,要專(zhuān)業(yè)點(diǎn)...

這個(gè)方法,看似是好簡(jiǎn)單的東西,可是不深究的話是學(xué)不到東西的!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • C#判斷一個(gè)字符串是否包含另一個(gè)字符串的方法

    C#判斷一個(gè)字符串是否包含另一個(gè)字符串的方法

    這篇文章主要介紹了C#判斷一個(gè)字符串是否包含另一個(gè)字符串的方法,涉及C#中IndexOf方法的使用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-04-04
  • 在C#中如何使用Dapper詳解(譯)

    在C#中如何使用Dapper詳解(譯)

    這篇文章主要給大家介紹了關(guān)于在C#中如何使用Dapper的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2018-09-09
  • C#12中的Collection expressions集合表達(dá)式語(yǔ)法糖詳解

    C#12中的Collection expressions集合表達(dá)式語(yǔ)法糖詳解

    C#12中引入了新的語(yǔ)法糖來(lái)創(chuàng)建常見(jiàn)的集合,并且可以使用..來(lái)解構(gòu)集合,將其內(nèi)聯(lián)到另一個(gè)集合中,下面就跟隨小編一起學(xué)習(xí)一下C#12中這些語(yǔ)法糖的使用吧
    2023-11-11
  • 基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法

    基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法

    ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識(shí)別ModbusTCP請(qǐng)求報(bào)文,返回對(duì)應(yīng)的ModbusTCP報(bào)文,今天給大家分享一下,如何基于C#來(lái)ModbusTCP服務(wù)器接口,需要的朋友可以參考下
    2025-01-01
  • 使用C#在注冊(cè)表中保存信息的例子

    使用C#在注冊(cè)表中保存信息的例子

    最近做的項(xiàng)目需要在注冊(cè)表中記錄一些用戶設(shè)置,方便在程序下次啟動(dòng)時(shí)讀取設(shè)置,應(yīng)用上次用戶保存的設(shè)置,挺簡(jiǎn)單的
    2014-04-04
  • c#中如何獲取指定字符前的字符串

    c#中如何獲取指定字符前的字符串

    這篇文章主要介紹了c#中如何獲取指定字符前的字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • WinForm入門(mén)與基本控件使用詳解

    WinForm入門(mén)與基本控件使用詳解

    本文主要介紹了WinForm入門(mén)與基本控件使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#對(duì)圖片進(jìn)行馬賽克處理可控制模糊程度的實(shí)現(xiàn)代碼

    C#對(duì)圖片進(jìn)行馬賽克處理可控制模糊程度的實(shí)現(xiàn)代碼

    本文通過(guò)實(shí)例代碼給大家介紹了C#對(duì)圖片進(jìn)行馬賽克處理可控制模糊程度的實(shí)現(xiàn)方法,代碼超簡(jiǎn)單,具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • 在c#中使用servicestackredis操作redis的實(shí)例代碼

    在c#中使用servicestackredis操作redis的實(shí)例代碼

    本篇文章主要介紹了在c#中使用servicestackredis操作redis的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法

    C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

高清| 霍城县| 宜春市| 聂荣县| 嘉禾县| 秦安县| 巫溪县| 江都市| 宁远县| 南汇区| 柘城县| 沂南县| 竹北市| 宜都市| 易门县| 满洲里市| 奇台县| 日土县| 睢宁县| 永新县| 淮滨县| 怀宁县| 咸丰县| 枞阳县| 通州市| 闵行区| 澜沧| 岚皋县| 岑溪市| 盐亭县| 萨嘎县| 安徽省| 兰坪| 玉溪市| 来安县| 阿克陶县| 吴桥县| 盐边县| 体育| 涟源市| 贵溪市|