[英]DLLImport using C++ code in C# with struct & prototype
這是我的第一篇帖子
在以SO發表我的問題之前。 我曾經嘗試使用DLLImport在C#中調用C ++方法(它在名為SDK.dll的DLL文件中)。 但是我遇到了一個問題:
我試圖使用DLLImport在C#中使用此C ++代碼。
RegisterVideoPreviewCB(HANDLE hChannel, PVOID pContext, VideoCaptureCB_Ptr pCB);
除了VideoCaptureCB_Ptr,我可以轉換HANDLE和PVOID。 我知道我在C#中沒有VideoCaptureCB_Ptr的定義。
我回頭看看SDK.h文件。 我看到這個代碼
typedef void (CALLBACK * VideoCaptureCB_Ptr)(PVOID pContext, BYTE * apData[3], VideoSampleInfo_T * pVSI);
typedef struct _VideoSampleInfo_T
{
ULONG idFormat; //
ULONG lSignalState;
int nLen; // not used for raw video data(e.g. YUV420)
int nWidth;
int nHeight;
int anPitchs[3]; // only used for raw video data(e.g. YUV420)
ULONG dwMicrosecsPerFrame; // 1000*1000/FPS
ULONG field;
int iSerial;
} VideoSampleInfo_T;
我想我必須先使用DllImport聲明_VideoSampleInfo_T和VideoCaptureCB_Ptr,然后再在C#中聲明RegisterVideoPreviewCB。
因此,任何人都可以幫助我使用DllImport或以某種方式(例如重新聲明VideoCaptureCB_Ptr)在C#中創建VideoCaptureCB_Ptr定義。 因此,我可以將其傳遞給RegisterVideoPreviewCB定義的參數。
提前致謝。
---------------更新哦,我意識到我只需要將以下代碼轉換為C#
typedef void (CALLBACK * VideoCaptureCB_Ptr)(PVOID pContext, BYTE * apData[3], VideoSampleInfo_T * pVSI);
typedef struct _VideoSampleInfo_T
{
ULONG idFormat; //
ULONG lSignalState;
int nLen; // not used for raw video data(e.g. YUV420)
int nWidth;
int nHeight;
int anPitchs[3]; // only used for raw video data(e.g. YUV420)
ULONG dwMicrosecsPerFrame; // 1000*1000/FPS
ULONG field;
int iSerial;
} VideoSampleInfo_T;
請幫助我將其轉換為C#
我們可以通過兩種方式來實現它,這取決於其他方面的考慮(例如時間,精力,維護)。
將非托管代碼移植到托管代碼中:如您所見,我們可以使用類似的C#類型來代替C ++。 我們有委派函數的指針,struct / enum / class當前的typedef struct。但是,這種方法肯定要花費很多時間,似乎我們做了雙重工作,不能隨意使用非托管代碼。
使用工具將非托管代碼轉換為托管代碼:例如,我們帶有Windows SDK附帶名稱為tlpimp.exe( http://clrinterop.codeplex.com/releases/view/17579 )的工具。 您可以參考它並嘗試更新一些規則以適應您的情況。 通常,我們可能需要為非托管代碼類型的復雜類型創建一些中間的c#類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.