Вы не можете выполнить маршал CString
, так как это не нативный тип - это класс C ++, который упаковывает массив char
.
Вы можете использовать маршал от string
до char[]
, так как char[]
является нативным типом. У вас должны быть параметры для функции, в которую вы хотите выполнить P / Invoke, в виде базовых типов, таких как int
, bool
, char
или struct
, но не классов. Подробнее здесь:
http://msdn.microsoft.com/en-us/library/aa446536.aspx
Чтобы вызвать функции, которые принимают CString в качестве аргумента, вы можете сделать что-то вроде этого:
//Compile with /UNICODE
extern "C" MFCINTEROP_API int GetStringLen(const TCHAR* str) {
CString s(str);
return s.GetLength();
//Or call some other function taking CString as an argument
//return CallOtherFunction(s);
}
[DllImport("YourDLL.dll", CharSet=CharSet.Unicode)]
public extern static int GetStringLen(string param);
В приведенной выше функции P / Invoke мы передаем System.String
, который может маршалировать до char*/wchar_t*
. Затем неуправляемая функция создает экземпляр CString
и работает с ним.
По умолчанию System.String
маршалируется до char*
, поэтому будьте осторожны с тем, какую строку принимает неуправляемая версия. Эта версия использует TCHAR
, которая становится wchar_t
при компиляции с /UNICODE
. Вот почему вам нужно указать CharSet=CharSet.Unicode
в атрибуте DllImport
.