本文針對海康視訊監控 SDK 從 VC++ 移植至 C# 的核心難點進行系統總結,涵蓋記憶體管理、資料型別對應、回調函式聲明、委派錯誤排查四大面向,助你快速完成跨語言 SDK 封裝。
Marshal.AllocHGlobal 配置記憶體(對應 VC++ GlobalAlloc)。Marshal.FreeHGlobal 釋放,否則長時間運行會導致記憶體耗盡。| VC++ 型別 | C# 對應 | 備註 |
|---|---|---|
| 結構體參數 | ref Struct | 傳址呼叫,如 RECT → Rectangle |
| HWND、HANDLE | IntPtr | 通常取 Control.Handle 或 Panel.Handle |
| COLORREF | int | Color.FromArgb(...).ToArgb() |
| int*/ULONG*/DWORD* | out int / out long / out ushort | 輸出參數 |
| int、long | int / long | 範圍不超限即可互換 |
// 錯誤:區域變數會被 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);
}
char* 對應 IntPtr 而非 string,需用 Marshal.PtrToStringAnsi 轉換。[UnmanagedFunctionPointer(CallingConvention.Cdecl)]。移植過程中還需細心比對 SDK 文件、VC++ 範例與 C# 簽名,建議保持同步更新本文作為團隊參考手冊。祝移植順利!