С# string marshalling и LocalAlloc

У меня есть обратный вызов COM из неуправляемой библиотеки DLL, которую мне нужно использовать в С#. Неуправляемая DLL ожидает, что вызывающий абонент будет выделять память с помощью LocalAlloc (который будет вызывать LocalFree), заполнить его WSTR и установить value и chars на указатель WSTR и длину строки соответственно.

Фрагмент кода, который я пытаюсь преобразовать в С#:

STDMETHODIMP CMyImpl::GetString(LPCSTR field, LPWSTR* value, int* chars) {
    CStringW ret;

    if (!strcmp(field, "matrix")) {
        ret = L"None";
        if (...)
            ret.Append(L"001");
        else if (...) 
            ret.Append(L"002");
        else
            ret.Append(L"003");
    }

    if (!ret.IsEmpty()) {
        int len = ret.GetLength();
        size_t sz = (len + 1) * sizeof(WCHAR);
        LPWSTR buf = (LPWSTR)LocalAlloc(LPTR, sz);

        if (!buf) {
            return E_OUTOFMEMORY;
        }

        wcscpy_s(buf, len + 1, ret);
        *chars = len;
        *value = buf;

        return S_OK;
    }

    return E_INVALIDARG; 
}

Каким будет эквивалентный код С#?

EDIT: COM-интерфейс:

[id(2)] HRESULT GetString([in] LPCSTR field, [out] LPWSTR* value, [out] int* chars);

Ответ 1

Простым способом было бы импортировать функцию LocalAlloc, преобразовать строку в байты, используя UnicodeEncoding.GetBytes и скопируйте их в выделенную память с помощью Marshall.Copy.