Передача строки символов const char * из неуправляемого в управляемый - PullRequest
1 голос
/ 08 октября 2010

У меня есть два компонента связи - один управляемый, другой неуправляемый.Управляемому необходимо извлечь символьную строку из неуправляемой реализации (ту же строку или просто копию).Я попробовал следующий код.

// Unmanaged code
const char* GetTestName(Test* test)
{
    return test->getName();
}

// Managed wrapper
[DllImport(DllName, EntryPoint = "GetTestName")]
public static extern IntPtr GetTestName(IntPtr testObj);

// API Invocation
IntPtr testName = GetTestName(test);
string testStr = Marshal.PtrToStringAuto(testName);

Но значение testStr не соответствует ожидаемому.Кто-нибудь знает, что я здесь делаю не так?Любые предложения будут очень полезны.

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Вы близко, но вы должны использовать PtrToStringAnsi (). Авто использует системную настройку по умолчанию, которая будет Unicode.

1 голос
/ 08 октября 2010

Я бы предложил это вместо:

[DllImport(DllName, EntryPoint = "EntryPoint")]
[MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetTestName(IntPtr testObj);

UnmanagedType.LPStr работает со строками и System.Text.StringBuilder и, возможно, с другими (я только использовал эти два). Я обнаружил, что StringBuilder работает более согласованно.

См. эту статью MSDN для получения дополнительной информации о различных параметрах сортировки строк.

...