Альтернативы для маршалинга неуправляемого кода c ++ в c# управляемый код - PullRequest
0 голосов
/ 02 апреля 2020

Я делаю приложение на C ++ и пытаюсь создать для него GUI front-end в C# и обмениваться данными между ними. Моя первоначальная идея состояла в том, чтобы скомпилировать серверную часть c ++ в виде DLL и использовать ее функции, импортировав ее в интерфейс и используя P / Invoke, но я столкнулся с проблемой:

Мои неуправляемые классы C ++ используют универсальные 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# front-end и C ++ back-end, которые я могу использовать вместо P / Invoke?

...