2012-06-14 2 views
0

У меня есть общие вопросы при импорте C++-созданной DLL в C#.Повторное использование функций C++ путем импорта DLL в C#

1) Я написал функции C++, используя указатели, такие как двойные указатели, массив указателей и т. Д. например. static int someFunc(char *var[]) Как повторно использовать их, поскольку C# не поддерживает указатели.

2) Должен ли я предоставить все функции через [DllImport()] в C#? то есть у меня есть функция, называемая someFunc, которая вызывает другие функции внутри. Должен ли я также раскрывать эти функции в разделе «DllImport»

3) Может кто-нибудь объяснить, почему мне требуется обрабатывать неуправляемый код на C#, особенно когда я импортирую dll из C++?

+2

C# поддерживает указатели! – Bas

ответ

1

Пункт 1 Ответ: использовать небезопасный ключевое слово в объявлении функции в C#

static unsafe int someFunc(char* var[]); 

пункт 2 Ответ: Там нет необходимости импортировать все функции. only import someFunc()

пункт 3 ответ: C# использует управляемый код, который является безопасным по типу и относится к некоторой допустимой ячейке памяти. Однако указатели, как на C++, могут ссылаться или не ссылаться на какое-либо действительное место в памяти. Поэтому вам нужно обрабатывать неуправляемый код на C#.

+0

Привет Я использую тип данных под названием DWORD, который я определил в заголовочном файле C++, который я включаю в свой код на C++ DLL. Как справиться с этим? поскольку DWORD не отображается в C#. –

+0

Пожалуйста, замените DWORD на System.Int32. Если DWORD без знака, используйте System.UInt32. –

0

C# поддерживает указатели в небезопасных регионах, однако вы также можете использовать IntPtr, который похож на C++ 'void * DllImport с IntPtr как параметр или возвращаемое значение.

Правильная вещь, однако, должна была бы использовать marshaling для автоматического перевода символа char * на System.String и наоборот. (И до translate an array of char* to an array of strings.)

Смежные вопросы