在C++/CLI中包装本机C++结构

Acr*_*gma 7 c# clr c++-cli wrapper

我从未使用过C++或C++/CLI,但我想在C#项目中使用本机C++库.我用Google搜索了一下,学到了一些关于C++/CLI的东西,并决定给它一个良好的开端.但我不确定我是否做得对.

struct在本机命名空间中有以下内容:

中avcodec.h

typedef struct AVCodecDescriptor {
    enum AVCodecID     id;
    enum AVMediaType type;

    const char      *name;
    const char *long_name;
    int             props;
} AVCodecDescriptor;
Run Code Online (Sandbox Code Playgroud)

现在我想将它包装struct在C++/CLI中以便在C#中使用它:

public ref struct AVCodecDescriptorWrapper {

    private:
        struct AVCodecDescriptor *_avCodecDescriptor;

    public:
        AVCodecDescriptorWrapper() {
            _avCodecDescriptor = new AVCodecDescriptor();
        }
        ~AVCodecDescriptorWrapper() {
            delete _avCodecDescriptor;
        }

        // what do?
        property AVCodecID Id {
            AVCodecID get() {
                return; // what comes here ????
            }
        }

};
Run Code Online (Sandbox Code Playgroud)

然而,好像我做什么可怕的错误,因为我甚至能看到领域的的struct在C++/CLI AVCodecDescriptor.我必须enum在结构中包装s吗?我是否必须将它们复制到C++/CLI并进行转换(好吧,enum AVCodecID有350个值 - 复制/粘贴似乎是荒谬的.)

Nis*_*mar 5

您需要创建一个等效的本机结构和枚举的CLI类.

public ref class ManagedAVCodecDescriptor {
    ManagedAVCodecIDClass id;
    ManagedAVMediaTypeClass type;

    String^ name;
    String^ long_name;
    int props;
};
Run Code Online (Sandbox Code Playgroud)

枚举等效类将如下所示:

public enum class ManagedAVCodecIDClass
{
    xyx = 1,
    abc = 2,
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,在AVCodecDescriptorWrapper中,您应该获取AVCodecDescriptor对象并将所有信息放在ManagedAVCodecDescriptor对象中并将其传递给C#类.

ManagedAVCodecDescriptor^ mObject = gcnew ManagedAVCodecDescriptor();
mObject.setSomeValue(nativeStruct->somevalue);
Run Code Online (Sandbox Code Playgroud)

并将mObject作为通用C#对象传递给C#代码.