亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#的dllimport使用方法詳解

2020-01-24 02:49:03
字體:
來源:轉載
供稿:網友

DllImport是System.Runtime.InteropServices命名空間下的一個屬性類,其功能是提供從非托管DLL導出的函數的必要調用信息

DllImport屬性應用于方法,要求最少要提供包含入口點的dll的名稱。
DllImport的定義如下:

復制代碼 代碼如下:

[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
public DllImportAttribute(string dllName) {…} //定位參數為dllName
public CallingConvention CallingConvention; //入口點調用約定
public CharSet CharSet;                                   //入口點采用的字符接
public string EntryPoint;  //入口點名稱
public bool ExactSpelling;   //是否必須與指示的入口點拼寫完全一致,默認false
public bool PreserveSig;  //方法的簽名是被保留還是被轉換
public bool SetLastError;  //FindLastError方法的返回值保存在這里
public string Value { get {…} }
}

用法示例:

復制代碼 代碼如下:

[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);

以上是用來寫入ini文件的一個win32api。          用此方式調用Win32API的數據類型對應:DWORD=int或uint,BOOL=bool,預定義常量=enum,結構=struct。 

DllImport會按照順序自動去尋找的地方: 1、exe所在目錄 2、System32目錄 3、環境變量目錄所以只需要你把引用的DLL 拷貝到這三個目錄下 就可以不用寫路徑了 或者可以這樣server.MapPath(./bin/*.dll)web中的,同時也是應用程序中的 后來發現用[DllImport(@"C:/OJ/Bin/Judge.dll")]這樣指定DLL的絕對路徑就可以正常裝載。 這個問題最常出現在使用第三方非托管DLL組件的時候,我的也同樣是這時出的問題,Asp.Net Team的官方解決方案如下: 首先需要確認你引用了哪些組件,那些是托管的,哪些是非托管的.托管的很好辦,直接被使用的需要引用,間接使用的需要拷貝到bin目錄下.非托管的處理會比較麻煩.實際上,你拷貝到bin沒有任何幫助,因為CLR會把文件拷貝到一個臨時目錄下,然后在那運行web,而CLR只會拷貝托管文件,這就是為什么我們明明把非托管的dll放在了bin下卻依然提示不能加載模塊了.  具體做法如下:  首先我們在服務器上隨便找個地方新建一個目錄,假如為C:/DLL  然后,在環境變量中,給Path變量添加這個目錄  最后,把所有的非托管文件都拷貝到C:/DLL中.  或者更干脆的把DLL放到system32目錄  對于可以自己部署的應用程序,這樣未償不是一個解決辦法,然而,如果我們用的是虛擬空間,我們是沒辦法把注冊PATH變量或者把我們自己的DLL拷到system32目錄的。同時我們也不一定知道我們的Dll的物理路徑。  DllImport里面只能用字符串常量,而不能夠用Server.MapPath(@"~/Bin/Judge.dll")來確定物理路徑。ASP.NET中要使用DllImport的,必須在先“using System.Runtime.InteropServices;”不過,我發現,調用這種"非托管Dll”相當的慢,可能是因為我的方法需要遠程驗證吧,但是實在是太慢了。經過一翻研究,終于想到了一個完美的解決辦法首先我們用

復制代碼 代碼如下:

[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(String path);

[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);

[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);

分別取得了LoadLibrary和GetProcAddress函數的地址,再通過這兩個函數來取得我們的DLL里面的函數。
我們可以先用Server.MapPath(@"~/Bin/Judge.dll")來取得我們的DLL的物理路徑,然后再用LoadLibrary進行載入,最后用GetProcAddress取得要用的函數地址

以下自定義類的代碼完成LoadLibrary的裝載和函數調用

復制代碼 代碼如下:

public class DllInvoke
    {           
        [DllImport("kernel32.dll")]
        private extern static IntPtr LoadLibrary(String path);

        [DllImport("kernel32.dll")]  
        private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);

        [DllImport("kernel32.dll")]    
        private extern static bool FreeLibrary(IntPtr lib);    

        private IntPtr hLib;  

        public DllInvoke(String DLLPath)  
        {          
            hLib = LoadLibrary(DLLPath); 
        }      

        ~DllInvoke()    
        {       
            FreeLibrary(hLib); 
        }       

        //將要執行的函數轉換為委托 
        public Delegate Invoke(String APIName,Type t)    
        {          
            IntPtr api = GetProcAddress(hLib, APIName);  
            return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);    
        }
    }

下面代碼進行調用

復制代碼 代碼如下:

public delegate int Compile(String command, StringBuilder inf);
            //編譯
            DllInvoke dll = new DllInvoke(Server.MapPath(@"~/Bin/Judge.dll"));
            Compile compile = (Compile)dll.Invoke("Compile", typeof(Compile));
            StringBuilder inf;
            compile(@“gcc a.c -o a.exe“,inf);//這里就是調用我的DLL里定義的Compile函數

大家在實際工作學習C#的時候,可能會問:為什么我們要為一些已經存在的功能(比如Windows中的一些功能,C++中已經編寫好的一些方法)要重新編寫代碼,C#有沒有方法可以直接都用這些原本已經存在的功能呢?答案是肯定的,大家可以通過C#中的DllImport直接調用這些功能。   
DllImport所在的名字空間 using System.Runtime.InteropServices;   
MSDN中對DllImportAttribute的解釋是這樣的:可將該屬性應用于方法。DllImportAttribute 屬性提供對從非托管 DLL
導出的函數進行調用所必需的信息。作為最低要求,必須提供包含入口點的 DLL 的名稱。    DllImport 屬性定義如下:

復制代碼 代碼如下:

namespace System.Runtime.InteropServices  
 {    
     [AttributeUsage(AttributeTargets.Method)]  
     public class DllImportAttribute: System.Attribute 
     {    
         public DllImportAttribute(string dllName)
         {...}      

         public CallingConvention CallingConvention;  
         public CharSet CharSet;    
         public string EntryPoint;    
         public bool ExactSpelling;    
         public bool PreserveSig;      
         public bool SetLastError;    
         public string Value { get {...} }    
     }  
 }

說明:    
1、DllImport只能放置在方法聲明上。
2、DllImport具有單個定位參數:指定包含被導入方法的 dll 名稱的
dllName 參數。    
3、DllImport具有五個命名參數: 
a、CallingConvention
參數指示入口點的調用約定。如果未指定 CallingConvention,則使用默認值
CallingConvention.Winapi。
b、CharSet 參數指示用在入口點中的字符集。如果未指定 CharSet,則使用默認值
CharSet.Auto。       
c、EntryPoint 參數給出 dll 中入口點的名稱。如果未指定
EntryPoint,則使用方法本身的名稱。         
d、ExactSpelling 參數指示 EntryPoint
是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認值 false。         
e、PreserveSig
參數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT返回值和該返回值的一個名為 retval
的附加輸出參數的簽名。如果未指定 PreserveSig,則使用默認值 true。         
f、SetLastError 參數指示方法是否保留
Win32"上一錯誤"。如果未指定 SetLastError,則使用默認值 false。       
4、它是一次性屬性類。     
  
5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕一页二页| 欧美精品久久一区二区| 欧美激情一二区| 久久91亚洲精品中文字幕| 日韩av电影中文字幕| 欧美情侣性视频| 欧美高清不卡在线| 日韩精品福利网站| 国产亚洲精品久久久久动| 亚洲色图色老头| 欧美黑人性视频| 911国产网站尤物在线观看| 日韩av电影免费观看高清| 国产精品草莓在线免费观看| 精品久久久久久久久久国产| 亚洲午夜未满十八勿入免费观看全集| 国产激情综合五月久久| 国产69精品99久久久久久宅男| 亚洲美女av网站| www国产精品com| 成人黄色av网站| 亚洲影视九九影院在线观看| 久久久久久久一| 免费91在线视频| 91啪国产在线| 欧美乱人伦中文字幕在线| 国产精品com| 欧美精品xxx| 在线色欧美三级视频| 日本免费一区二区三区视频观看| 韩曰欧美视频免费观看| 欧美在线观看一区二区三区| 中文字幕日韩欧美精品在线观看| 欧美精品在线视频观看| 欧美性xxxxx| 国产视频精品在线| 日韩高清免费观看| 国产精品视频免费在线| 国产精品成人在线| 社区色欧美激情 | 欧美精品午夜视频| 亚洲视频网站在线观看| 久久69精品久久久久久久电影好| 亚洲视频在线播放| 欧美国产日韩二区| 国产精品678| 欧美限制级电影在线观看| 久久视频在线观看免费| 青青草国产精品一区二区| 草民午夜欧美限制a级福利片| 高潮白浆女日韩av免费看| 欧美电影免费观看高清完整| 国产精品久久久久国产a级| 中文字幕视频一区二区在线有码| 国产精品网址在线| 欧美成人中文字幕在线| 欧美制服第一页| 超碰91人人草人人干| 中文国产成人精品| 久久亚洲精品中文字幕冲田杏梨| 欧美午夜影院在线视频| 久久这里有精品| 91免费视频国产| 精品国产福利在线| 91免费欧美精品| 美女精品视频一区| 91chinesevideo永久地址| 亚洲精品午夜精品| 国产精品成久久久久三级| 国产精品小说在线| 成人在线视频福利| 成人久久久久爱| 成人黄色片在线| 亚洲欧美日韩中文在线制服| 成人网中文字幕| 久久久噜噜噜久噜久久| 这里只有视频精品| 亚洲精品久久久久中文字幕二区| 欧美精品午夜视频| 日韩毛片在线看| 欧美精品在线免费观看| 国产精品一区二区三区久久| 久久精品2019中文字幕| 91视频-88av| 日本19禁啪啪免费观看www| 77777少妇光屁股久久一区| 亚洲精品91美女久久久久久久| 国产亚洲精品日韩| 欧美激情一区二区三区久久久| 激情久久av一区av二区av三区| 永久免费精品影视网站| 午夜剧场成人观在线视频免费观看| 欧美高清视频在线播放| 91精品国产777在线观看| 欧美极品少妇xxxxⅹ免费视频| 伊人久久久久久久久久久| www.日韩av.com| 精品久久国产精品| 日韩欧美在线免费| 一本一本久久a久久精品牛牛影视| 亚洲第一男人天堂| 欧美老女人性视频| 97成人超碰免| 影音先锋欧美在线资源| 国产精品流白浆视频| 一本色道久久88综合亚洲精品ⅰ| 精品网站999www| 91天堂在线观看| 亚洲精品不卡在线| 日韩电影中文字幕| 欧美午夜性色大片在线观看| 97精品久久久| 欧美国产日韩二区| 欧美xxxx做受欧美| 日韩精品免费视频| 九九精品在线播放| 欧美人与性动交| 国语对白做受69| 日韩风俗一区 二区| 日韩av片永久免费网站| 欧美肥臀大乳一区二区免费视频| 久久伊人精品一区二区三区| 91免费看国产| 亚洲成av人片在线观看香蕉| 国产狼人综合免费视频| 97av在线视频免费播放| 国产欧美精品在线播放| 日韩欧美中文字幕在线播放| 欧美黑人国产人伦爽爽爽| 91亚洲国产成人久久精品网站| 色哟哟网站入口亚洲精品| 久久精品人人爽| 欧美一级大胆视频| 成人免费视频xnxx.com| 亚洲人成在线播放| 久国内精品在线| 日韩在线观看免费网站| 国产亚洲免费的视频看| 久久精品一区中文字幕| 亚洲精品小视频| 国产综合香蕉五月婷在线| 日韩大片在线观看视频| 狠狠色香婷婷久久亚洲精品| 91精品国产高清久久久久久| 亚洲人线精品午夜| 国产亚洲人成a一在线v站| 国产大片精品免费永久看nba| 欧美大人香蕉在线| 日韩高清免费观看| 日韩的一区二区| 国产精品吊钟奶在线| 国产精品视频区1| 日本午夜精品理论片a级appf发布| 国产精品美女www爽爽爽视频| 亚洲va电影大全| 91免费的视频在线播放| 亚洲xxx自由成熟| 日韩美女主播视频| 欧美日韩国产黄| 日韩精品视频在线观看免费| 91免费看国产| 欧美精品福利在线| 在线成人一区二区| 国产成人一区二区三区|