Как вызвать функцию C ++, которая возвращает интерфейс - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь выяснить, как вернуть ISubmitter из C ++ и использовать его на стороне C #.

Это заголовок (* .h):

class ISubmitter : public ISubRefCounter
{
public:
    virtual ~ISubmitter() {}

    virtual Sett::MAIN::SUBERRORS Prepare( const Sett::MAIN::IDoc *pDoc, const char *aName = NULL, uint32_t aVal = 255 ) = 0;

    virtual SUBERRORS Send( eTTYPE aPType = Announce ) = 0;

    virtual ISender * CreateSenderInstance( INFO *info ) = 0;
}

class ISubRefCounter
{
public:
    virtual ~ISubRefCounter() {};

    virtual int32_t AddRef()  = 0;

    virtual int32_t Release() = 0;
};

#if defined (__cplusplus)
    extern "C" {
#endif
        ISubmitter* SUB_API_CALL GetSubmitterInterface( void );
#if defined (__cplusplus)
    }
#endif

Я реализовал на C # так:

public interface ISubmitter : ISubRefCounter
{
    SUBERRORS Prepare(ref IDoc pDoc, string aName = "", uint aVal = 255 );

    SUBERRORS Send(eTTYPE aPType = eTTYPE.Announce);

    ISender CreateSenderInstance(ref INFO info);
}

public interface ISubRefCounter
{
    int AddRef();

    int Release();
}

А также пробовал с одним интерфейсом, без реализации ISubRefCounter , но вместо этого встраивая все в ISubmitter , вот так:

public interface ISubmitter
{
    SUBERRORS Prepare(ref IDoc pDoc, string aName = "", uint aVal = 255 );

    SUBERRORS Send(eTTYPE aPType = eTTYPE.Announce);

    ISender CreateSenderInstance(ref INFO info);

    int AddRef();

    int Release();
}

C # dll импорт:

[DllImport("SettSubmitter.dll", CharSet = CharSet.Ansi)]
public static extern ref ISubmitter GetSubmitterInterface();

При вызове GetSubmitterInterface () Я получаю:

'Cannot marshal' возвращаемое значение ': неверный управляемый / неуправляемый тип комбинация.

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...