我從來沒有使用C++或C++/CLI,但我想在C#項目中使用本機C++庫。我搜索了一下,學習了一些關於C++/CLI的知識,並決定給它一個良好的開端。但我不確定我是否做得對。在C++/CLI中包裝本機C++結構
我有一個本地命名空間下struct
:
中avcodec.h
typedef struct AVCodecDescriptor {
enum AVCodecID id;
enum AVMediaType type;
const char *name;
const char *long_name;
int props;
} AVCodecDescriptor;
現在我想換這個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 ????
}
}
};
但是,好像我正在做一些可怕的錯誤,因爲我甚至無法看到字段的struct
AVCodecDescriptor在C++/CLI中。我必須將結構中的enum
包裝爲?我是否需要將它們複製到C++/CLI中並進行投射(好吧,enum AVCodecID
有350個值 - 複製/粘貼似乎是嘲諷)。
在這裏使用'new'和'delete'是沒有意義的。 'private:AVCodecDescriptor _avCodecDescriptor;'就足夠了。是的,你必須包裝一切。包括枚舉。您需要將它們聲明爲託管類型。然後將它們從非託管映射到託管。至於你打包的方式,你應該這樣做嗎?你將如何管理'const char *'成員的生命週期。坦率地說,對我來說C++/CLI比p/invoke更容易。 –
@DavidHeffernan 1)private:AVCodecDescriptor _avCodecDescriptor不起作用,因爲VS告訴我我不能在託管類中使用非託管成員。 2)謝謝你澄清! 3)我還有什麼要包裝?這是很多教程處理它的方式。 4)我也不熟悉P/Invoke。但我需要從某個地方開始。我聽到很多人說P/Invoke會明顯變慢,因爲我正在使用的庫是ffmpeg ..好吧,你知道的。 – Acrotygma
return(ManagedAVCodecID)_avCodecDescriptor-> id;你也需要一個終結者。很確定ffmpeg已經被封裝過了。儘管如此,許多死亡項目實際上完成似乎是一個很大的障礙。 –