首页 > 解决方案 > 将 c++ 非托管代码编组为 c# 托管代码的替代方法

问题描述

我正在制作一个 C++ 应用程序并尝试在 C# 中为它创建一个 GUI 前端,并在两者之间进行通信。我最初的想法是将 c++ 后端编译为 DLL 并通过将其导入前端并使用 P/Invoke 来使用其功能,但我遇到了一个问题:

我的非托管 C++ 类正在使用泛型类型(例如 std::vector 或 std::list),并且不能编组为 C# 托管代码(至少据我所知)。

我的 C++ 课程之一:

class Album
{
public:
    Album() = default;
    Album(int ownerId, const std::string& name);
    Album(int ownerId, const std::string& name, const std::string& creationTime);

    const std::string& getName() const;
    void setName(const std::string& name);

    int getOwnerId() const;
    void setOwner(int userId);

    std::string getCreationDate() const;
    void setCreationDate(const std::string& creationTime);
    void setCreationDateNow();

    bool doesPictureExists(const std::string& name) const;
    void addPicture(const Picture& picture);
    void removePicture(const std::string& pictureName);

    Picture getPicture(const std::string& name) const;
    std::list<Picture> getPictures() const;

    void untagUserInAlbum(int userId);
    void tagUserInAlbum(int userId);

    void untagUserInPicture(int userId, const std::string& pictureName);
    void tagUserInPicture(int userId, const std::string& pictureName);

    bool operator==(const Album& other) const;
    friend std::ostream& operator<<(std::ostream& strOut, const Album& album);

private:
    int m_ownerId { 0 };
    std::string m_name;
    std::string m_creationDate;
    std::list<Picture> m_pictures;
};

什么是(如果存在)一些方法来“绕过”封送包含泛型类型的类对象的问题?如果没有,我可以使用 C# 前端与 C++ 后端之间的通信替代 P/Invoke 的良好替代方案吗?

标签: c#c++frontendbackendmarshalling

解决方案


推荐阅读