CharSet = CharSet.Auto ?? использовать CharSet.Ansi
Вы не можете использовать массив символов в качестве возврата, блок памяти, выделенный с ++, не может использоваться C #! В вашем случае вам, вероятно, нужно скопировать его в управляемую память C #.
Используйте для этого атрибут StringBuilder или атрибут MarshalAs, который скопирует для вас буфер в управляемую память C #.
Вы должны изменить свою функцию C ++, ваша функция C ++ должна записать в целевой буфер, который должен быть выделен, чтобы он содержал как минимум количество необходимых вам символов плюс один (для нулевого символа завершения).
[DllImport(@"MyDLL.dll", CharSet = CharSet.Ansi)]
private static extern void MyFunction([MarshalAs(UnmanagedType.LPStr)] string input, StringBuilder result);
public static string MyFunctionPublic(string input)
{
StringBuilder sb = new StringBuilder(input.Length + 1);
MyFunction(input, sb);
return sb.ToString();
}
И я ожидаю, что ваша функция C будет делать что-то вроде этого:
void __stdcall MyFunction(const char* input, char* result)
{
strcpy(result, input); // this is a dummy stupid code to show how it works.
}
Вероятно, вам понадобится функция, которая дает вам представление о том, сколько байтов вы должны выделить в C #. Эта функция может быть примерно такой:
int __stdcall ComputeMyFunctionBytes(const char* input)
{
return strlen(input); // this is a dummy stupid code to show how it works.
}
Никогда не возвращайте часть выделенной памяти в C #, он не может ничего с этим сделать, ни освободить, ни читать, ни писать, пока вы не используете небезопасный код, но это не то, что вы пытаетесь сделать.
Хорошая статья, кажется, здесь: http://www.devx.com/dotnet/Article/6990/1954
Также обратите внимание, что C # использует Unicode, 16 бит на символ, поэтому он будет преобразован из ANSI в Unicode.