这是我在SO中的第一篇文章
在我将问题发布到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;
我认为在使用C#声明RegisterVideoPreviewCB之前,我必须使用DllImport来声明_VideoSampleInfo_T和VideoCaptureCB_Ptr。
所以任何人都可以帮助我使用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#
答案 0 :(得分:0)
我们可以通过两种方式来实现它,取决于其他问题(例如时间,精力,维护......):
将非托管代码移植到托管代码中:如您所见,我们可以使用类似的C#而不是C ++。我们有委托发生函数指针,struct / enum / class现在的typedef结构。但是,这个方法需要花费很多时间,看起来我们做了一个双重工作,不能重用我们想要的非托管代码。 / p>
使用工具将非托管代码转换为托管代码:例如,我们提供了Windows SDK名称tlpimp.exe(http://clrinterop.codeplex.com/releases/view/17579)附带的工具。您可以参考它并尝试更新某些规则以适应您的情况。通常,我们可能需要为复杂类型的非托管代码类型创建一些中间c#类。