C # cadena de clasificación y LocalAlloc

Tengo una devolución de llamada COM desde una DLL no administrada que necesito usar en C #. La DLL no administrada espera que el destinatario asigne memoria utilizandoLocalAlloc (que la persona que llamaLocalFree), rellenarlo conWSTR y establecervalue ychars al puntero WSTR y la longitud de la cadena respectivamente.

Fragmento de código que intento convertir a C #:

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; 
}

¿Cuál sería el código C # equivalente?

EDITAR: Interfaz COM:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta