DLLImport使用C++;C#中的代码,带有结构和;原型

DLLImport使用C++;C#中的代码,带有结构和;原型,c#,c++,dllimport,C#,C++,Dllimport,这是我在SO的第一篇帖子 在我将我的问题发布到SO之前。在C++中,我曾尝试使用DLimPult调用C++方法(它是在DLL文件中命名为SDK.dll)。但我遇到了一个问题: 我曾尝试使用DLIMPORT在C++中使用这个C++代码。 我可以转换除VideoCaptureCB_Ptr之外的句柄和PVOID。我知道我没有C语言中的VideoCaptureCB#u Ptr的定义 我回顾一下SDK.h文件。我看到这个代码了 typedef void (CALLBACK * VideoCaptureCB

这是我在SO的第一篇帖子

在我将我的问题发布到SO之前。在C++中,我曾尝试使用DLimPult调用C++方法(它是在DLL文件中命名为SDK.dll)。但我遇到了一个问题:

我曾尝试使用DLIMPORT在C++中使用这个C++代码。 我可以转换除VideoCaptureCB_Ptr之外的句柄和PVOID。我知道我没有C语言中的VideoCaptureCB#u 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。所以我可以将其传递给RegisterServiceDeoPreviewCB定义的参数

提前谢谢

---------------更新 哦,我意识到我只需要将下面的代码转换成C#


请帮助我将其转换为C#

我们可以通过两种方式实现它,这取决于其他关注点(如时间、精力、维护空间等):

<> >端口非托管代码进入托管代码:正如您所看到的,我们可以有类似的C++类型而不是C++。我们有委托发生函数指针,struct/enum/class present typedef struct..但是,这个方法肯定要花很多时间,而且似乎我们做了双重工作,不能像我们希望的那样重用非托管代码

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


  • 我认为“函数指针=>delegate,struct=>C#struct with
    StructLayout(LayoutKind.Sequential)
    属性可能会起作用……你说得对!为了让代码在C#中运行,我已经将上面的代码重写为C#……但根据我的经验,我可以将其转换为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;
    
     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;