Можно ли вернуть LPWSTR из C ++ DLL в приложение C # - PullRequest
2 голосов
/ 01 марта 2012

Определение функции C ++ это

__declspec(dllexport) LPWSTR __stdcall GetErrorString(int errCode);

И я называю это в C # следующим образом

 [DllImport("DLLTest.dll")]
 public static extern string GetErrorString(int errCode);

 static void Main(string[] args)
{
    string result = GetErrorString(5);
}

Я получаю необработанное исключение типа System.Runtime.InteropServices.SEHException

Я даже не уверен, нормально ли для C ++ DLL пытаться вернуть LPWSTR в C # ...

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Возможно, вы захотите попробовать что-то вроде этого:

[DllImport("DLLTest.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern string GetErrorString(int errCode);
0 голосов
/ 01 марта 2012

См. Принятый ответ здесь: PInvoke для функции C, которая возвращает символ *

Краткая версия: вы должны упорядочить возвращаемое значение как IntPtr, или среда выполнения .NET делает некоторые предположения и пытается удалить память, на которую указывает указатель на символ. Это может вызвать сбои, если предположения, сделанные во время выполнения, неверны.

...