Как вызвать функцию, определенную в C ++ DLL, которая имеет параметр типа int *, изнутри кода C #? - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть родной обычный C ++ Dll, который я хочу вызвать из кода C #, поэтому я создал класс C ++ / CLI (как описано здесь и здесь ), который будет включать управляемый C ++ код, который может быть вызван любым кодом C # напрямую и который может вызывать вызовы в нативный неуправляемый C ++.

Одна из функций в нативной C ++ dll имеет параметр типа int *. Как мне объявить в функции-обертке и как я могу преобразовать ее в int *?

Ответы [ 2 ]

5 голосов
/ 03 февраля 2011

Это C / C ++ способ передачи значения по ссылке.Вы должны использовать ключевое слово ref или out :

[DllImport("something.dll")]
private static extern void Foo(ref int arg);

В C ++ / CLI это будет выглядеть примерно так:

public ref class Wrapper {
private:
    Unmanaged* impl;
public:
    void Foo(int% arg) { impl->Foo(&arg); }
    // etc..
};
2 голосов
/ 03 февраля 2011
[DllImport("some.dll")]
static extern void SomeCPlusPlusFunction(IntPtr arg);

IntPtr - это тип, который приблизительно эквивалентен void *.

Из вашего комментария лучше всего сделать что-то подобное (C #):

int size = 3;
fixed (int *p = &size) {
    IntPtr data = Marshal.AllocHGlobal(new IntPtr(p));
    // do some work with data
    Marshal.FreeHGlobal(data); // have to free it
}

но поскольку AllocHGlobal может принимать int, я не знаю, почему вы не сделали бы это:

IntPtr data = Marshal.AllocHGlobal(size);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...