中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中[ImportDll()]有什么用

發布時間:2021-09-03 15:21:49 來源:億速云 閱讀:200 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C#中[ImportDll()]有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C#中[ImportDll()]有什么用”這篇文章吧。

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

如果用 IDE往工程里add reference時,它會提示這幾個dll是沒有注冊的,不是.NET托管的。好吧,順便補充一下.NET托管和非托管。

具體官方術語是:

托管DLL就是能夠在公共語言運行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,并且擴展名為“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動態鏈接庫等,其中就包括了封裝所有Windows API函數的DLL文件。各種非托管DLL中的函數在公共語言運行庫中不能直接被調用,而需要經過.Net框架提供的“平臺調用”服務后才可以。

通俗點講就是:

托管Dll就在.NET環境生成的Dll文件。

非托管dll不是在.NET環境生成的dll文件。比如說用c寫的,用C++寫的。

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

[ImportDll()] 這種方法是通過P/Iovoke 來調用WIN32 API。其作用是導入外部的函數,這些函數不是由NET托管的。當然當使用[ImportDll()] 時,必須要引入命名空間:

using System.Runtime.InteropServices;

舉一個例子

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

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

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

MarshalAs 是指提供向非托管代碼封裝數據時的規則,上面告訴net,第一個參數要用string 類型,第三個是bool型;

這里要注意一個問題,剛開始改代碼時,調試通過了,一發到IIS,其他人根本無法成功調用這個方法,我糾結了半天,后來才找到原因!

因為是在前人基礎上改代碼,沒注意前人留下的坑,這份代碼的初始者,將dll的引入路徑做成的是絕對路徑:

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

這樣的話,IIS是無法去找到這個路徑的,即使你在C:\CloudDll目錄下有這個dll,所以,要專業點...

以上是“C#中[ImportDll()]有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

颍上县| 屯门区| 蒲城县| 资阳市| 石城县| 叶城县| 棋牌| 东辽县| 周宁县| 岳池县| 陕西省| 墨竹工卡县| 剑川县| 乳山市| 玉门市| 溧阳市| 南充市| 唐海县| 冷水江市| 宁蒗| 定陶县| 大邑县| 改则县| 贺兰县| 手游| 蒙城县| 安达市| 双桥区| 那坡县| 梁山县| 绥宁县| 龙海市| 吴桥县| 金塔县| 北碚区| 黄山市| 东乌珠穆沁旗| 宁波市| 张家川| 若尔盖县| 奉新县|