首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 視訊監控系列(14):VC++ SDK 轉 C# 關鍵點總結與避坑指南

     編輯:關於C#

本文針對海康視訊監控 SDK 從 VC++ 移植至 C# 的核心難點進行系統總結,涵蓋記憶體管理、資料型別對應、回調函式聲明、委派錯誤排查四大面向,助你快速完成跨語言 SDK 封裝。

1. 非受控記憶體管理

  • 使用 Marshal.AllocHGlobal 配置記憶體(對應 VC++ GlobalAlloc)。
  • 必須 配對呼叫 Marshal.FreeHGlobal 釋放,否則長時間運行會導致記憶體耗盡。

2. 資料型別對應對照表

VC++ 型別C# 對應備註
結構體參數ref Struct傳址呼叫,如 RECT → Rectangle
HWND、HANDLEIntPtr通常取 Control.Handle 或 Panel.Handle
COLORREFintColor.FromArgb(...).ToArgb()
int*/ULONG*/DWORD*out int / out long / out ushort輸出參數
int、longint / long範圍不超限即可互換

3. 回調函式必須聲明為成員變數


// 錯誤:區域變數會被 GC 回收,導致執行時存取違規
// STREAM_DIRECT_READ_CALLBACK sdrc = new STREAM_DIRECT_READ_CALLBACK(Callback);

// 正確:聲明為類別成員,生命週期與表單同步
private STREAM_DIRECT_READ_CALLBACK sdrc;

private void PreviewAndClientConnect()
{
    sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
    HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, this.Handle);
}

4. 委派呼叫常見錯誤與解決

  1. 參數型別不符:如 VC++ char* 對應 IntPtr 而非 string,需用 Marshal.PtrToStringAnsi 轉換。
  2. 委派未聲明為成員:同上,會被 GC 回收。
  3. 呼叫慣例不符:若報「記憶體已被回收」或存取違規,在委派上標記:
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]。

結語

移植過程中還需細心比對 SDK 文件、VC++ 範例與 C# 簽名,建議保持同步更新本文作為團隊參考手冊。祝移植順利!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved