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

C#中的USBHID設(shè)備通信全解

 更新時間:2026年05月24日 09:51:09   作者:weixin_36019375  
USBHID是USB中的一種設(shè)備類別,廣泛應(yīng)用于鍵盤、鼠標、游戲手柄等輸入設(shè)備,本文就來詳細的介紹一下C#中的USBHID設(shè)備通信,具有一定的參考價值,感興趣的可以了解一下

簡介:USBHID(USB Human Interface Device)規(guī)范定義了如何支持鍵盤、鼠標等交互設(shè)備。在C#中,實現(xiàn)與USBHID設(shè)備的通信需要調(diào)用Windows API和P/Invoke技術(shù)。本文詳細介紹了如何在C#編程環(huán)境下枚舉、打開、讀寫以及錯誤處理USBHID設(shè)備,并提供了一個完整的示例代碼。

1. USBHID概述和C#中的實現(xiàn)

USBHID(Human Interface Device)是USB(Universal Serial Bus)中的一種設(shè)備類別,廣泛應(yīng)用于鍵盤、鼠標、游戲手柄等輸入設(shè)備。相較于傳統(tǒng)的串口通信,USBHID具有即插即用、傳輸速率高、錯誤率低等優(yōu)點,成為許多硬件設(shè)備通信的首選方式。

在C#中實現(xiàn)USBHID通信,需要深入了解USBHID的工作原理和數(shù)據(jù)交互流程。C#通過P/Invoke(Platform Invocation Services)技術(shù)調(diào)用底層的Windows API,實現(xiàn)了與USBHID設(shè)備的數(shù)據(jù)交互。本章將詳細介紹USBHID在C#環(huán)境中的實現(xiàn)方法,為后續(xù)章節(jié)的學習打下堅實的基礎(chǔ)。

2. P/Invoke技術(shù)與Windows API調(diào)用

2.1 P/Invoke技術(shù)簡介

2.1.1 P/Invoke技術(shù)的定義

P/Invoke是Platform Invocation Services的縮寫,是一種在.NET環(huán)境中調(diào)用非托管代碼的方法,尤其是用于調(diào)用Windows API函數(shù)。其允許程序員在C#或其他.NET語言中直接使用C語言聲明的函數(shù)。這種技術(shù)使得.NET程序能夠利用豐富而成熟的Windows API,同時也使得維護舊的Windows應(yīng)用程序變得更加容易。

2.1.2 P/Invoke技術(shù)的工作原理

P/Invoke的工作原理主要依賴于兩個關(guān)鍵概念:托管代碼(Managed Code)和非托管代碼(Unmanaged Code)。托管代碼運行在CLR(Common Language Runtime)的保護和管理下,而非托管代碼則直接在操作系統(tǒng)級別執(zhí)行,不受CLR的管理。P/Invoke通過提供一個橋梁,使得托管代碼可以調(diào)用非托管代碼,同時CLR能夠管理相應(yīng)的內(nèi)存、類型轉(zhuǎn)換、異常等。

2.2 Windows API在C#中的調(diào)用

2.2.1 Windows API的搜索與選擇

在進行P/Invoke調(diào)用前,首先需要對所需的Windows API函數(shù)進行搜索和選擇。這通常需要了解函數(shù)的作用、參數(shù)以及返回類型。開發(fā)者可以參考MSDN(Microsoft Developer Network)文檔來查找正確的API。一旦確定了要使用的API,就需要了解它的準確名稱、所在的DLL以及參數(shù)類型和順序。

2.2.2 在C#中聲明和使用Windows API函數(shù)

在C#中使用P/Invoke聲明Windows API函數(shù)通常需要使用 DllImport 屬性。這個屬性告訴CLR在哪個DLL文件中尋找非托管函數(shù)。下面是一個簡單的例子,展示了如何在C#中聲明和使用 MessageBox API函數(shù):

using System;
using System.Runtime.InteropServices;

class Program
{
    // 使用DllImport屬性指定DLL名和入口點
    [DllImport("user32.dll", SetLastError = true)]
    static extern int MessageBox(int hWnd, String text, String caption, uint type);

    static void Main()
    {
        // 調(diào)用MessageBox API
        MessageBox(0, "Hello World!", "My Message Box", 0);
    }
}

在這個例子中, MessageBox 函數(shù)在 user32.dll 中聲明,并且通過 DllImport 屬性導(dǎo)入。函數(shù)的返回類型是 int ,并且有四個參數(shù):窗口句柄 hWnd 、文本字符串 text 、標題字符串 caption 和消息框類型 type 。

2.3 P/Invoke技術(shù)的深入分析

2.3.1 數(shù)據(jù)類型轉(zhuǎn)換與映射

P/Invoke在不同環(huán)境間進行函數(shù)調(diào)用時,需要考慮數(shù)據(jù)類型的一致性。C#中的數(shù)據(jù)類型與C語言中的數(shù)據(jù)類型并不完全相同。例如,C#中的 int 類型是32位的,而C語言中的 int 可能是16位的。因此,P/Invoke通過特殊的屬性如 StructLayout MarshalAs 來確保數(shù)據(jù)類型的正確映射。

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);

[StructLayout(LayoutKind.Sequential)]
struct MEMORY_BASIC_INFORMATION
{
    public IntPtr BaseAddress;
    public IntPtr AllocationBase;
    public uint AllocationProtect;
    public IntPtr RegionSize;
    public StateEnum State;
    public AllocationType Protect;
    public TypeEnum Type;
}

// 使用時
MEMORY_BASIC_INFORMATION mbi = new MEMORY_BASIC_INFORMATION();
// ...調(diào)用VirtualAllocEx獲取信息...
VirtualQueryEx(hProcess, IntPtr.Zero, out mbi, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));

2.3.2 異常處理與資源管理

調(diào)用非托管代碼時,可能會遇到各種異常情況。P/Invoke提供了 arshal.GetLastWin32Error() 方法來獲取上一次調(diào)用非托管函數(shù)時所發(fā)生的錯誤代碼。另外,為了防止資源泄露,建議使用 try-finally 語句來確保即使在發(fā)生異常的情況下,也能夠正確釋放資源。

IntPtr handle = IntPtr.Zero;
try
{
    handle = CreateFile("somefile.txt", GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
    if (handle == INVALID_HANDLE_VALUE)
    {
        int errorCode = Marshal.GetLastWin32Error();
        throw new IOException("Unable to open file", errorCode);
    }
    // ...使用文件...
}
finally
{
    if (handle != IntPtr.Zero && handle != INVALID_HANDLE_VALUE)
    {
        CloseHandle(handle);
    }
}

以上示例中, CreateFile CloseHandle 都是Windows API函數(shù),通過 try-finally 確保了文件句柄在使用完畢后能夠安全關(guān)閉,即使在讀取文件時發(fā)生異常。

以上章節(jié)內(nèi)容涵蓋了P/Invoke技術(shù)的基礎(chǔ)知識、在C#中調(diào)用Windows API的步驟和技巧,并對數(shù)據(jù)類型映射、異常處理與資源管理進行了深入分析。通過理解這些知識,開發(fā)者可以更加有效地使用P/Invoke技術(shù),從而在.NET環(huán)境中充分利用Windows強大的API資源。

3. 枚舉USBHID設(shè)備的步驟

3.1 USBHID設(shè)備枚舉概念

3.1.1 枚舉設(shè)備的重要性

枚舉是發(fā)現(xiàn)和識別USB設(shè)備的過程,尤其對于USBHID設(shè)備,這是實現(xiàn)數(shù)據(jù)通信的基礎(chǔ)。在USB通信協(xié)議中,枚舉過程使主機能夠識別連接到USB端口上的設(shè)備類型,并獲取其配置信息。沒有正確的枚舉過程,USBHID設(shè)備無法被識別和使用。

枚舉過程涉及到幾個關(guān)鍵步驟,包括檢測設(shè)備連接事件、獲取設(shè)備描述符、配置設(shè)備以及最終與設(shè)備建立通信。通過這些步驟,軟件能夠獲得必要的信息,如設(shè)備的供應(yīng)商ID、產(chǎn)品ID、設(shè)備類等,這為后續(xù)的操作提供了必要的前提條件。

3.1.2 枚舉過程中的關(guān)鍵技術(shù)點

在枚舉過程中,需要使用一系列的Windows API函數(shù)來完成任務(wù)。這些API包括但不限于 SetupDiGetClassDevs 、 SetupDiEnumDeviceInterfaces 、 CreateFile 、 GetLastError 等。通過這些API,可以在程序中模擬枚舉過程,發(fā)現(xiàn)和打開USBHID設(shè)備。

關(guān)鍵技術(shù)點之一是如何準確地使用Windows提供的設(shè)備接口。這通常通過設(shè)備接口的GUID來完成。另一個關(guān)鍵點是錯誤處理,因為在枚舉過程中可能會遇到各種異常情況,如設(shè)備尚未連接或配置不正確等,這時需要通過適當?shù)腻e誤處理來確保程序的健壯性。

3.2 枚舉USBHID設(shè)備的操作步驟

3.2.1 使用Windows API枚舉設(shè)備

枚舉USBHID設(shè)備的第一步是使用 SetupDiGetClassDevs 函數(shù)獲取設(shè)備信息集。代碼示例如下:

using System;
using System.Runtime.InteropServices;

class UsbHidEnumeration
{
    const int DIGCF_PRESENT = 0x2;
    const int DIGCF_DEVICEINTERFACE = 0x10;

    [DllImport("setupapi.dll", SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid classGuid, IntPtr enumerator, IntPtr hwndParent, int flags);

    [DllImport("setupapi.dll", SetLastError = true)]
    static extern bool SetupDiEnumDeviceInterfaces(IntPtr deviceInfoSet, IntPtr deviceInfoData, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);

    static Guid HidGuid = new Guid(0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30);

    public static void EnumerateHidDevices()
    {
        IntPtr deviceInfoSet = SetupDiGetClassDevs(ref HidGuid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

        SP_DEVICE_INTERFACE_DATA deviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
        deviceInterfaceData.cbSize = Marshal.SizeOf(deviceInterfaceData);

        for (int memberIndex = 0; SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref HidGuid, memberIndex, ref deviceInterfaceData); memberIndex++)
        {
            // 處理每一個找到的設(shè)備接口
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    struct SP_DEVICE_INTERFACE_DATA
    {
        public int cbSize;
        public Guid InterfaceClassGuid;
        public int Flags;
        public IntPtr Reserved;
    }
}

在上述代碼中, SetupDiGetClassDevs 函數(shù)用于獲取包含所有HID設(shè)備信息的設(shè)備信息集。接下來,使用 SetupDiEnumDeviceInterfaces 函數(shù)遍歷這些設(shè)備接口,并處理每一個找到的設(shè)備接口。

3.2.2 枚舉設(shè)備時的常見問題及解決方案

在枚舉USBHID設(shè)備的過程中,可能會遇到設(shè)備未正確識別或無法打開等問題。這些問題通常由以下原因?qū)е拢?/p>

  • 設(shè)備驅(qū)動未安裝或安裝不正確
  • 設(shè)備權(quán)限問題,如沒有足夠的權(quán)限訪問設(shè)備
  • USB端口問題或設(shè)備物理連接問題

針對這些問題,可以采取以下解決方案:

  • 確保設(shè)備的驅(qū)動程序是最新的,并且正確安裝在系統(tǒng)上。
  • 檢查程序是否有足夠的權(quán)限訪問設(shè)備。在Windows中,可能需要以管理員權(quán)限運行程序。
  • 檢查USB端口和設(shè)備連接情況,嘗試重新連接設(shè)備或更換不同的端口。

此外,代碼中要適當?shù)靥幚鞼indows API返回的錯誤碼,通過調(diào)用 GetLastError 函數(shù)獲取錯誤詳情,并進行相應(yīng)的錯誤處理邏輯。

if (deviceInfoSet == IntPtr.Zero)
{
    int errorCode = Marshal.GetLastWin32Error();
    throw new Exception("無法獲取設(shè)備信息集。錯誤代碼: " + errorCode);
}

在上述代碼段中,如果 SetupDiGetClassDevs 函數(shù)返回了 IntPtr.Zero ,表示枚舉失敗。通過調(diào)用 Marshal.GetLastWin32Error ,程序可以獲取錯誤碼,并拋出異常,從而讓用戶或開發(fā)者了解具體的問題所在。

4. 打開和關(guān)閉USBHID設(shè)備的方法

在本章中,我們將深入探討如何在C#中打開和關(guān)閉USBHID設(shè)備,同時涉及與之相關(guān)的最佳實踐和異常處理策略。

4.1 打開USBHID設(shè)備的步驟

4.1.1 設(shè)備句柄的獲取

打開USBHID設(shè)備的第一步是獲取設(shè)備的句柄,句柄是操作系統(tǒng)用來標識和管理資源的一種方式。在C#中,我們通常使用 CreateFile 函數(shù)來獲取設(shè)備的句柄。

using System;
using System.Runtime.InteropServices;

class UsbHidDevice
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);
    // USB設(shè)備的路徑和訪問權(quán)限等參數(shù)
    private static readonly string DevicePath = "\\\\.\\HIDI001";
    private static readonly uint GenericRead = 0x80000000;

    public static IntPtr OpenDevice()
    {
        IntPtr deviceHandle = CreateFile(
            DevicePath,
            GenericRead,
            0,
            IntPtr.Zero,
            0x3, // OPEN_EXISTING
            0,
            IntPtr.Zero);
        if(deviceHandle == IntPtr.Zero || deviceHandle == new IntPtr(-1))
        {
            throw new System.ComponentModel.Win32Exception();
        }

        return deviceHandle;
    }
}

4.1.2 打開設(shè)備時的異常處理

當嘗試打開一個USBHID設(shè)備時,可能會遇到各種異常,例如權(quán)限不足或設(shè)備不存在。異常處理是確保程序穩(wěn)定運行的關(guān)鍵。

try
{
    IntPtr deviceHandle = UsbHidDevice.OpenDevice();
    // 使用設(shè)備句柄進行后續(xù)操作
}
catch (System.ComponentModel.Win32Exception ex)
{
    // 處理異常情況,例如用戶沒有足夠的權(quán)限或設(shè)備不存在
    Console.WriteLine($"Error opening device: {ex.Message}");
}

4.2 關(guān)閉USBHID設(shè)備的策略

4.2.1 設(shè)備關(guān)閉的條件和時機

關(guān)閉USBHID設(shè)備的時機取決于應(yīng)用程序的設(shè)計。一般來說,在程序結(jié)束前應(yīng)關(guān)閉所有打開的設(shè)備,釋放資源。

// 在程序結(jié)束前關(guān)閉設(shè)備句柄
if(deviceHandle != IntPtr.Zero)
{
    CloseHandle(deviceHandle);
}

4.2.2 關(guān)閉設(shè)備前的清理工作

關(guān)閉設(shè)備前的清理工作是確保設(shè)備狀態(tài)正確和數(shù)據(jù)完整性的重要步驟。在關(guān)閉句柄之前,應(yīng)確保所有數(shù)據(jù)傳輸已成功完成。

// 示例代碼,確保設(shè)備已斷開所有連接
if( // 設(shè)備正在傳輸數(shù)據(jù)的條件判斷)
{
    // 等待數(shù)據(jù)傳輸完成或取消傳輸
}

在這個階段,也可以記錄一些關(guān)鍵信息,比如最后關(guān)閉設(shè)備時的時間戳,用于調(diào)試或日志分析。

本章節(jié)介紹了打開和關(guān)閉USBHID設(shè)備的方法,包括設(shè)備句柄的獲取和異常處理策略。在下一章節(jié)中,我們將繼續(xù)探討發(fā)送和接收數(shù)據(jù)的機制。

5. 發(fā)送和接收數(shù)據(jù)的機制

數(shù)據(jù)通信是USBHID設(shè)備功能實現(xiàn)的核心。為確保數(shù)據(jù)有效傳輸,了解數(shù)據(jù)包結(jié)構(gòu)、通信方式和相關(guān)的錯誤處理策略是必不可少的。

5.1 數(shù)據(jù)通信的基本概念

5.1.1 數(shù)據(jù)包的結(jié)構(gòu)和格式

在USBHID設(shè)備通信中,數(shù)據(jù)包是指數(shù)據(jù)傳輸?shù)幕締卧C恳粋€數(shù)據(jù)包由報告描述符定義,該描述符定義了數(shù)據(jù)字段的大小、類型和用途。通常,數(shù)據(jù)包分為輸入報告、輸出報告和特征報告三類。

輸入報告用于從設(shè)備讀取數(shù)據(jù),如按鍵狀態(tài)或傳感器數(shù)據(jù)。輸出報告用于向設(shè)備發(fā)送數(shù)據(jù),比如發(fā)送控制信號。特征報告則用于修改設(shè)備的配置或狀態(tài),通常涉及到設(shè)備的特征設(shè)置。

5.1.2 數(shù)據(jù)傳輸?shù)耐胶彤惒椒绞?/h4>

USBHID設(shè)備支持同步和異步兩種數(shù)據(jù)傳輸方式。

  • 同步傳輸 :在同步傳輸模式下,數(shù)據(jù)的發(fā)送和接收是阻塞的。這意味著,如果在等待數(shù)據(jù)的時候,CPU將不會執(zhí)行其他任務(wù),直到數(shù)據(jù)傳輸完成。

  • 異步傳輸 :相反,異步傳輸允許CPU在等待數(shù)據(jù)傳輸完成時繼續(xù)執(zhí)行其他任務(wù)。這種方式提高了程序的響應(yīng)性和效率。

5.2 實現(xiàn)數(shù)據(jù)發(fā)送和接收的策略

5.2.1 利用Windows API實現(xiàn)數(shù)據(jù)通信

在C#中,使用Windows API可以實現(xiàn)USBHID設(shè)備的數(shù)據(jù)發(fā)送和接收。這通常涉及到 ReadFile WriteFile 函數(shù),它們分別用于讀取和寫入數(shù)據(jù)。以下是一個使用這些函數(shù)的代碼示例:

public class HidDevice
{
    public const int HidImports.HidGuid = 0x4d1e55b2, 0xafa6, 0x4fad, 0x9c, 0x85, 0x19, 0xb8, 0x80, 0xee, 0xca, 0x8b;

    [DllImport("hid.dll")]
    private static extern bool HidD_GetAttributes(IntPtr HidDeviceObject, out HidAttributes Attributes);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode,
        IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead,
        out uint lpNumberOfBytesRead, IntPtr lpOverlapped);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite,
        out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
    ...
}

5.2.2 數(shù)據(jù)傳輸中的錯誤檢測與處理

在數(shù)據(jù)通信過程中,錯誤檢測和處理至關(guān)重要。例如, ReadFile WriteFile 函數(shù)會返回一個布爾值以指示操作成功或失敗。錯誤代碼可以通過調(diào)用 Marshal.GetLastWin32Error() 獲取。

常見的錯誤包括設(shè)備未連接、權(quán)限不足等。針對這些錯誤,開發(fā)者需要設(shè)計相應(yīng)的異常處理邏輯,確保程序的健壯性。

在后續(xù)的章節(jié)中,我們將更深入地探討錯誤處理以及示例代碼的使用。接下來,我們進入第六章,詳細討論USBHID設(shè)備的錯誤處理策略。

到此這篇關(guān)于C#中的USBHID設(shè)備通信全解的文章就介紹到這了,更多相關(guān)C# USBHID設(shè)備通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C#為PDF文檔添加專業(yè)水印的實現(xiàn)指南

    使用C#為PDF文檔添加專業(yè)水印的實現(xiàn)指南

    在數(shù)字化時代,PDF文檔已成為信息傳遞和存儲的核心載體,無論是商業(yè)合同、技術(shù)報告還是內(nèi)部資料,保護文檔的版權(quán)、標識其狀態(tài)或強化品牌形象都至關(guān)重要,為PDF文檔添加水印,正是實現(xiàn)這些目標的一種高效且常見的方式,所以本文介紹了如何使用C#為PDF文檔添加專業(yè)水印
    2025-09-09
  • C#中寫入和讀取TXT文件問題

    C#中寫入和讀取TXT文件問題

    這篇文章主要介紹了C#中寫入和讀取TXT文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#?Winform實現(xiàn)圓角無鋸齒按鈕

    C#?Winform實現(xiàn)圓角無鋸齒按鈕

    這篇文章主要介紹了C#?Winform實現(xiàn)圓角無鋸齒按鈕,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • C#實現(xiàn)簡單的點餐系統(tǒng)

    C#實現(xiàn)簡單的點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單的點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#中ArrayList?類的使用詳解

    C#中ArrayList?類的使用詳解

    這篇文章主要介紹了C#中ArrayList?類的使用詳解,動態(tài)數(shù)組ArrayList類在System.Collecions的命名空間下,所以使用時要加入System.Collecions命名空間,而且ArrayList提供添加,插入或移除某一范圍元素的方法
    2022-09-09
  • 快速學習c# 枚舉

    快速學習c# 枚舉

    這篇文章主要介紹了c# 枚舉的相關(guān)知識,文中講解非常細致,示例代碼幫助大家學習,感興趣的朋友可以了解下
    2020-06-06
  • C#獲取HTML文本的第一張圖片與截取內(nèi)容摘要示例代碼

    C#獲取HTML文本的第一張圖片與截取內(nèi)容摘要示例代碼

    在日常web開發(fā)的時候,經(jīng)常會遇到需要獲取保存的HTML文本中的第一張圖片,并且截取內(nèi)容摘要的效果,例如織夢的后臺添加完詳細內(nèi)容后就是自動讀取內(nèi)容摘要,并保存第一張圖片為縮略圖,那么這篇文章跟大家分享下利用C#如何實現(xiàn),感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • C#中協(xié)變逆變的實現(xiàn)

    C#中協(xié)變逆變的實現(xiàn)

    本文詳細介紹了C#中協(xié)變逆變,通過示例展示了協(xié)變和逆變在泛型接口和委托中的應(yīng)用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01
  • C#控制反轉(zhuǎn)的使用詳解

    C#控制反轉(zhuǎn)的使用詳解

    控制反轉(zhuǎn)是將對象的創(chuàng)建、依賴管理和生命周期控制從應(yīng)用程序代碼中轉(zhuǎn)移出來,交由外部容器來管理,下面就來詳細的介紹一下C#控制反轉(zhuǎn)的使用,感興趣的可以了解一下
    2026-01-01
  • c#圖片處理之圖片裁剪成不規(guī)則圖形

    c#圖片處理之圖片裁剪成不規(guī)則圖形

    最近項目要求實現(xiàn)不規(guī)則裁剪功能。本來想用html5的canvas在前端實現(xiàn)的,但是發(fā)現(xiàn)有點困難,以下為C#端對圖對片的處理
    2014-05-05

最新評論

兴国县| 茂名市| 田林县| 论坛| 清徐县| 普兰店市| 安福县| 六安市| 宜黄县| 宜黄县| 福鼎市| 松原市| 陆良县| 桃源县| 镇沅| 茶陵县| 肇东市| 板桥市| 濉溪县| 岳普湖县| 大方县| 峨山| 乐亭县| 龙井市| 武山县| 清流县| 夹江县| 盐源县| 双峰县| 连平县| 内江市| 泸溪县| 莱阳市| 龙岩市| 高淳县| 黔西| 文山县| 桑植县| 岑溪市| 高邮市| 禹城市|