Как вызвать функцию, определенную в C++ DLL с параметром типа int *, из кода C#?

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

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


person Ashutosh    schedule 03.02.2011    source источник


Ответы (2)


[DllImport("some.dll")]
static extern void SomeCPlusPlusFunction(IntPtr arg);

IntPtr — это тип, примерно эквивалентный типу void *.

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

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);
person plinth    schedule 03.02.2011
comment
А затем используйте метод ToPointer(), чтобы получить указатель void *, который затем можно привести к int * и разыменовать. - person Jonathan Grynspan; 03.02.2011
comment
Привет, ребята, спасибо за ответ, я использую следующий сегмент кода для преобразования указателя на основе ваших ответов. Пожалуйста, скажите мне, если я ошибаюсь. Извиняюсь за любую глупую ошибку, я новичок в программировании для C# и C++/CLI. интервал b=3; IntPtr errno = новый IntPtr(&b); int var = (int)Marshal::AllocHGlobal(errno).ToPointer(); - person Ashutosh; 04.02.2011
comment
Привет, ребята, большое спасибо за ваши ответы, наконец-то у меня все заработало. Я использую IntPtr для объявления int, а затем использую ToPointer для его преобразования и использования в собственном C++. Но теперь я не знаю, как мне вернуть ir, я имею в виду, как преобразовать int* обратно в IntPtr. Прошу ответить, если кто знает ответьте. - person Ashutosh; 08.02.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..
};
person Hans Passant    schedule 03.02.2011
comment
В зависимости от других параметров (если рядом с ним есть параметр размера) это также может быть способом передачи динамически выделяемых массивов. - person Joshua Rodgers; 03.02.2011