DLLImport使用C#中的C ++代码与struct&原型

时间:2014-03-26 09:33:09

标签: c# c++ dllimport

这是我在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#

1 个答案:

答案 0 :(得分:0)

我们可以通过两种方式来实现它,取决于其他问题(例如时间,精力,维护......):

  1. 将非托管代码移植到托管代码中:如您所见,我们可以使用类似的C#而不是C ++。我们有委托发生函数指针,struct / enum / class现在的typedef结构。但是,这个方法需要花费很多时间,看起来我们做了一个双重工作,不能重用我们想要的非托管代码。 / p>

  2. 使用工具将非托管代码转换为托管代码:例如,我们提供了Windows SDK名称tlpimp.exe(http://clrinterop.codeplex.com/releases/view/17579)附带的工具。您可以参考它并尝试更新某些规则以适应您的情况。通常,我们可能需要为复杂类型的非托管代码类型创建一些中间c#类。