Чтение строки из управляемого кода С# в C++ wchar * [] получение AccessViolation

Вопрос прост. Хотите прочитать строку из управляемого кода С# на мой неуправляемый код C++ в WCHAR* []. Функция C:

extern "C" __declspec(dllexport) int __cdecl myfunc(int argc, WCHAR* argv[])

и в С# я импортировал DLL:

[DllImport("mydll.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public static extern int myfunc(int argc, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder str);

Я запускаю, но когда я попытался прочитать строку в коде C++, я получаю AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Каков правильный способ сделать это и наоборот (т.е. передача строки из C++ неуправляемого в управляемый код С#)?

Помогите оценить. благодаря

3 ответа

Кажется, что ваша функция C ожидает массив строк, и вместо этого вы передаете одну строку.

Я не использовал P/Invoke, но этот вопрос мог бы дать некоторое представление.


Если вы используете WCHAR*, возможно, вы должны попытаться объединиться как UnmanagedType.LPWStr вместо этого, чтобы избежать пропускания вдвое меньше памяти, чем ожидалось?

Документация по умолчанию Marshaling for Strings должна предоставить вам более подробную информацию.


Я не уверен, что С# для C++, но я могу помочь вам в вашей проблеме C++ до С#.

Экспортируйте функцию из кода C++ следующим образом:

DllExport std::string MyFunction( std::string MyParameter) ;

Это может быть импортировано в ваш код С# следующим образом:

[DllImport("DLLName.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
 [return: MarshalAs(UnmanagedType.LPStr)]
 public static extern string MyFunction([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string MyParameter);

Теперь в вашем коде С# функция " MyFunction " примет строку и вернет строку. Затем вы можете вызвать MyFunction и выполнить операции.

licensed under cc by-sa 3.0 with attribution.