免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#DllImport的用法
C# DllImport的用法 收藏
大家在實(shí)際工作學(xué)習(xí)C#的時(shí)候,可能會(huì)問:為什么我們要為一些已經(jīng)存在的功能(比如Windows中的一些功能,C++中已經(jīng)編寫好的一些方法)要重新編寫代碼,C#有沒有方法可以直接都用這些原本已經(jīng)存在的功能呢?答案是肯定的,大家可以通過C#中的DllImport直接調(diào)用這些功能。
DllImport所在的名字空間 using System.Runtime.InteropServices;
MSDN中對(duì)DllImportAttribute的解釋是這樣的:可將該屬性應(yīng)用于方法。DllImportAttribute 屬性提供對(duì)從非托管 DLL 導(dǎo)出的函數(shù)進(jìn)行調(diào)用所必需的信息。作為最低要求,必須提供包含入口點(diǎn)的 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具有單個(gè)定位參數(shù):指定包含被導(dǎo)入方法的 dll 名稱的 dllName 參數(shù)。
  3、DllImport具有五個(gè)命名參數(shù):
   a、CallingConvention 參數(shù)指示入口點(diǎn)的調(diào)用約定。如果未指定 CallingConvention,則使用默認(rèn)值 CallingConvention.Winapi。
   b、CharSet 參數(shù)指示用在入口點(diǎn)中的字符集。如果未指定 CharSet,則使用默認(rèn)值 CharSet.Auto。
   c、EntryPoint 參數(shù)給出 dll 中入口點(diǎn)的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。
   d、ExactSpelling 參數(shù)指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認(rèn)值 false。
   e、PreserveSig 參數(shù)指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換。當(dāng)簽名被轉(zhuǎn)換時(shí),它被轉(zhuǎn)換為一個(gè)具有 HRESULT 返回值和該返回值的一個(gè)名為 retval 的附加輸出參數(shù)的簽名。如果未指定 PreserveSig,則使用默認(rèn)值 true。
   f、SetLastError 參數(shù)指示方法是否保留 Win32"上一錯(cuò)誤"。如果未指定 SetLastError,則使用默認(rèn)值 false。
  4、它是一次性屬性類。
  5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。
DllImport的用法:
DllImport("MyDllImport.dll")]
private static extern int mySum(int a,int b);
一 在C#程序設(shè)計(jì)中使用Win32類庫
常用對(duì)應(yīng)類型:
1、DWORD 是 4 字節(jié)的整數(shù),因此我們可以使用 int 或 uint 作為 C# 對(duì)應(yīng)類型。
2、bool 類型與 BOOL 對(duì)應(yīng)。
示例一:調(diào)用 Beep() API 來發(fā)出聲音
Beep() 是在 kernel32.lib 中定義的,在MSDN 中的定義,Beep具有以下原型:
BOOL Beep(DWORD dwFreq, // 聲音頻率
DWORD dwDuration // 聲音持續(xù)時(shí)間);
用 C# 編寫以下原型:
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
示例二:枚舉類型和常量
MessageBeep() 是在 user32.lib 中定義的,在MSDN 中的定義,MessageBeep具有以下原型:
BOOL MessageBeep(UINT uType // 聲音類型
);
用C#編寫一下原型:
public enum BeepType
{
  SimpleBeep = -1,
  IconAsterisk = 0x00000040,
  IconExclamation = 0x00000030,
  IconHand = 0x00000010,
  IconQuestion = 0x00000020,
  Ok = 0x00000000,
}
uType 參數(shù)實(shí)際上接受一組預(yù)先定義的常量,對(duì)于 uType 參數(shù),使用 enum 類型是合乎情理的。
[DllImport("user32.dll")]
public static extern bool MessageBeep(BeepType beepType);
示例三:處理結(jié)構(gòu)
有時(shí)我需要確定我筆記本的電池狀況。Win32 為此提供了電源管理函數(shù),搜索 MSDN 可以找到GetSystemPowerStatus() 函數(shù)。
BOOL GetSystemPowerStatus(
  LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);
此函數(shù)包含指向某個(gè)結(jié)構(gòu)的指針,我們尚未對(duì)此進(jìn)行過處理。要處理結(jié)構(gòu),我們需要用 C# 定義結(jié)構(gòu)。我們從非托管的定義開始:
typedef struct _SYSTEM_POWER_STATUS {
BYTE  ACLineStatus;
BYTE  BatteryFlag;
BYTE  BatteryLifePercent;
BYTE  Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
   然后,通過用 C# 類型代替 C 類型來得到 C# 版本。
struct SystemPowerStatus
{
  byte ACLineStatus;
  byte batteryFlag;
  byte batteryLifePercent;
  byte reserved1;
  int batteryLifeTime;
  int batteryFullLifeTime;
}
這樣,就可以方便地編寫出 C# 原型:
[DllImport("kernel32.dll")]
public static extern bool GetSystemPowerStatus(
  ref SystemPowerStatus systemPowerStatus);
   在此原型中,我們用“ref”指明將傳遞結(jié)構(gòu)指針而不是結(jié)構(gòu)值。這是處理通過指針傳遞的結(jié)構(gòu)的一般方法。
   此函數(shù)運(yùn)行良好,但是最好將 ACLineStatus 和 batteryFlag 字段定義為 enum:
  enum ACLineStatus: byte
   {
    Offline = 0,
    Online = 1,
    Unknown = 255,
   }
   enum BatteryFlag: byte
   {
    High = 1,
    Low = 2,
    Critical = 4,
    Charging = 8,
    NoSystemBattery = 128,
    Unknown = 255,
   }
請(qǐng)注意,由于結(jié)構(gòu)的字段是一些字節(jié),因此我們使用 byte 作為該 enum 的基本類型
示例四:處理字符串

二 C# 中調(diào)用C++代碼
int 類型
[DllImport(“MyDLL.dll")]
//返回個(gè)int 類型
public static extern int mySum (int a1,int b1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(int a2,int b2)
{
//a2 b2不能改變a1 b1
//a2=..
//b2=...
return a+b;
}
//參數(shù)傳遞int 類型
public static extern int mySum (ref int a1,ref int b1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(int *a2,int *b2)
{
//可以改變 a1, b1
*a2=...
*b2=...
return a+b;
}

DLL 需傳入char *類型
[DllImport(“MyDLL.dll")]
//傳入值
public static extern int mySum (string astr1,string bstr1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr2,char * bstr2)
{
//改變astr2 bstr 2 ,astr1 bstr1不會(huì)被改變
return a+b;
}

DLL 需傳出char *類型
[DllImport(“MyDLL.dll")]
// 傳出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf );
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr,char * bstr)
{
//傳出char * 改變astr bstr -->abuf, bbuf可以被改變
return a+b;
}
DLL 回調(diào)函數(shù)
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
using System;
using System.Runtime.InteropServices;
public delegate bool CallBack(int hwnd, int lParam); //定義委托函數(shù)類型
public class EnumReportApp
{
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
public static void Main() {
CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0);
}
public static bool Report(int hwnd, int lParam)
{
Console.Write("Window handle is ");
Console.WriteLine(hwnd); return true;
}
}
DLL 傳遞結(jié)構(gòu)
BOOL PtInRect(const RECT *lprc, POINT pt);
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Point {
public int x;
public int y;
}
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
Class XXXX {
[DllImport("User32.dll")]
public static extern bool PtInRect(ref Rect r, Point p);
}

本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jame_peng/archive/2009/07/28/4387906.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C#中DllImport用法和路徑問題
C# 實(shí)現(xiàn)以驅(qū)動(dòng)方式(winio)模擬鍵盤鼠標(biāo)(part 1)
C#串口通訊(轉(zhuǎn)載)
c#類,封裝了鍵盤,和鼠標(biāo)模擬,和內(nèi)存讀?。ㄉ昃?頁 1) - 網(wǎng)絡(luò)安全 - ZDNet...
C#調(diào)用dll時(shí)的類型轉(zhuǎn)換總結(jié)
計(jì)算機(jī)世界網(wǎng)-用Visual C#調(diào)用Windows API函數(shù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服