P / Invoke поддерживается только для интерфейсов Си.YMMV, если вы пытаетесь заставить его общаться с конструкциями C ++.В этом случае вам необходимо выяснить, во что именно компилятор C ++ переводил ссылку, поскольку компиляторы C ++ могут реализовать это любым способом, который они пожелают.
Если вы хотите иметь возможность P/ Вызовите это, но не хотите использовать семантику указателя на сайте вызова, вы можете сделать что-то вроде:
int Activation::Activate(int *p_NumActivated, char **p_EventsActivated)
{
return Activate(p_NumActivated, *p_EventsActivated);
}
int Activation::Activate(int *p_NumActivated, char *&p_EventsActivated)
{
char *pTemp = "Hello";
p_EventsActivated = pTemp;
*p_NumActivated = 1;
return 0;
}
, который предоставляет простой указатель, который вы сможете использовать более просто P / Invoke.
Заметьте, однако, что любая строка, которую вы добавили, вероятно, не будет модифицируемой рассматриваемой функцией.Это связано с тем, что строки .NET являются строками UTF-16, а функция C ++ использует строки ASCII, которые не полностью совместимы друг с другом.Вам, вероятно, придется преобразовать строку .NET в ASCII, выполнить ее маршалинг, выполнить маршалинг обратно, а затем снова преобразовать обратно в UTF-16.
О, еще одна вещь: как написано, вы собираетесьчтобы эта функция работала, нужно передать ссылку на объект Activation
.Позиция этого аргумента будет зависеть от компилятора C ++.